Cheating Blitz comment voting

Наближават избори, а живеем в 2013 година така, че очаквано днешната политагитация се води по форуми, социални мрежи и всякакви сайтове.

Направи ми впечатление как в Blitz.bg понякога оценките за коментарите се развиват за секунди и чуждото мнение се потапя с много на брой отрицателни гласове, а “правилното” се подкрепя.

Седнах и намерих една статия с която да експериментирам за целта – http://www.blitz.bg/article/33765 и един безобиден коментар от нея

Ето и избрания коментар за целта.

Ето и избрания коментар за целта.

След което отваряме конзола и пишем заветния ред:
curl --data "vote=1&tag=show&id=143698" "http://www.blitz.bg/libs/commentsajax.php?vote=1&tag=show&id=143698"

Ето и резултата от няколко извиквания на реда:

curl --data "vote=1&tag=show&id=143698" "http://www.blitz.bg/libs/commentsajax.php?vote=1&tag=show&id=143698"
<span class=\"ocenka\">Оценка<br />-0 <span>+16</span></span>
curl --data "vote=1&tag=show&id=143698" "http://www.blitz.bg/libs/commentsajax.php?vote=1&tag=show&id=143698"
<span class=\"ocenka\">Оценка<br />-0 <span>+17</span></span>
curl --data "vote=1&tag=show&id=143698" "http://www.blitz.bg/libs/commentsajax.php?vote=1&tag=show&id=143698"
<span class=\"ocenka\">Оценка<br />-0 <span>+18</span></span>
curl --data "vote=1&tag=show&id=143698" "http://www.blitz.bg/libs/commentsajax.php?vote=1&tag=show&id=143698"
<span class=\"ocenka\">Оценка<br />-0 <span>+19</span></span>
curl --data "vote=1&tag=show&id=143698" "http://www.blitz.bg/libs/commentsajax.php?vote=1&tag=show&id=143698"
<span class=\"ocenka\">Оценка<br />-0 <span>+20</span></span>

Изглежда оценките може да се манипулират. Забелязах същото в сайтовете на 24Часа, Дир, Дневник, Капитал и още много други. Но няма да ви помагам със скриптове за тях.
Затова когато видите мнения с много плюсове или минуси имайте едно на ум, че е възможно да са манипулирани.

Posted in Linux, OSX, Windows | Tagged , | Leave a comment

Autopost to Svejo.net

Ако преди седмица ви показах как можете да публикувате във Facebook то днес ще ви покажа как можете да го направите във Svejo.net

Svejo add url to site

Svejo add url to site


/*******************************
* Svejo Status Updater
* Peter Nikolow
* http://peter.nikolow.me
* March 29, 2013
*******************************/

$login_email = 'type-here-your-mail';
$login_pass = 'type-here-your-password';
$url_4submit = 'type-here-your-url';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://svejo.net/user/login');
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 600x800)");
$loginpage = curl_exec($ch);

curl_setopt($ch, CURLOPT_POST, 1);
preg_match("/input name=\"authenticity_token\" type=\"hidden\" value=\"(.*?)\"/", $loginpage, $form_authtoken);
curl_setopt($ch, CURLOPT_POSTFIELDS,'authenticity_token='.urlencode($form_authtoken[1]).'&user%5Bemail_or_username%5D='.urlencode($login_email).'&user%5Burl_referer%5D=http%3A%2F%2Fsvejo.net%2F&user%5Bremember_me%5D=0&user%5Bpassword%5D='.urlencode($login_pass).'&commut=%D0%92%D0%BB%D0%B5%D0%B7');
$loginpage = curl_exec($ch);

sleep(10);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_URL, 'http://svejo.net/publish/');
$page = curl_exec($ch);

sleep(10);
curl_setopt($ch, CURLOPT_POST, 1);
preg_match("/input name=\"authenticity_token\" type=\"hidden\" value=\"(.*?)\"/", $page, $form_authtoken);
$formvars = array();
$formvars['authenticity_token'] = $form_authtoken[1];
$formvars['story[url]'] = $url_4submit;
$formvars['commit'] = "Добави";
curl_setopt($ch, CURLOPT_POSTFIELDS, $formvars);
curl_setopt($ch, CURLOPT_URL, 'http://svejo.net/publish/submit');
$page2 = curl_exec($ch);

curl_close($ch);
?>

А сега малко разшифровка на горния код.

  1. Трябва да се заредим страницата http://svejo.net/user/login
  2. От горната страница вземаме изключително важния параметър authenticity_token който го подаваме заедно с името/паролата към същата страница
  3. Зареждаме тази страница http://svejo.net/publish/ с цел вземането на authenticity_token
  4. Извършваме POST към http://svejo.net/publish/submit като подаваме token-a и URL-a които трябва да бъдат предадени

За всеки случай сме прибавили едно временно заспиване от 10 секунди между заявките за да не може системата да ни разпознае като ботове, каквито всъщност сме. Средно дневно в системата се прибавят около 2100 линка (информацията е от 30 Март 2013 година) което прави 87,5 линка на час. Или приблизително 2,5 линка на минута. Ако горния код се модифицира също като предходния би могъл денонощно да публикува всякакви линкове независимо от времето,но не е това целта на упражнението. Задачата е приключена и вече имаме скрипт за автоматично публикуване във Svejo.net

Posted in Linux, OSX, Windows | Tagged , | Leave a comment

Autopost to Facebook

От известно време ме тормози идеята за автоматично обновяване (autopost) на статуса във Facebook и други социални мрежи без други системи и приложения. Затова взех задачата присърце, седнах и преправих един прост скрипт който да свърши черната работа.

Facebook status update

Facebook status update


/*******************************
* Facebook Status Updater version 0.1
* Peter Nikolow
* http://peter.nikolow.me
* March 22, 2013
*******************************/

function random_string( )
{
$character_set_array = array( );
$character_set_array[ ] = array( 'count' => 7, 'characters' => 'abcdefghijklmnopqrstuvwxyz' );
$character_set_array[ ] = array( 'count' => 1, 'characters' => '0123456789' );
$temp_array = array( );
foreach ( $character_set_array as $character_set )
{
for ( $i = 0; $i < $character_set[ 'count' ]; $i++ )
{
$temp_array[ ] = $character_set[ 'characters' ][ rand( 0, strlen( $character_set[ 'characters' ] ) - 1 ) ];
}
}
shuffle( $temp_array );
return implode( '', $temp_array );
}

$status = random_string(10);
$login_email = 'type-here-your-mail';
$login_pass = 'type-here-your-pass';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://m.facebook.com/login.php?refsrc=http%3A%2F%2Fwww.facebook.com%2Flogin.php&refid=9');
curl_setopt($ch, CURLOPT_POSTFIELDS,'email='.urlencode($login_email).'&pass='.urlencode($login_pass).'&login=Login');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 600x800)");
$loginpage = curl_exec($ch);

curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
$page = curl_exec($ch);

curl_setopt($ch, CURLOPT_POST, 1);
preg_match("/input type=\"hidden\" name=\"fb_dtsg\" value=\"(.*?)\"/", $page, $form_id);
preg_match("/form method=\"post\" id=\"composer_form\" action=\"(.*?)\"/", $page, $form_num);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'fb_dtsg=' . $form_id[1] . '&privacy=&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84&target=&status=' . urlencode($status) . '&update=' . urlencode("Share"));

curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com' . $form_num[1]);
$page2 = curl_exec($ch);

curl_close($ch);
?>

Скрипта е сравнително глупав, но ще ви го обясня накратко:

  1. Генерира се случаен стринг от 10 символа който ще бъде нашия нов статус. Това е много важно защото FB блокира показването на еднакви статуси и ми коства няколко часа докато го проумея. С това се избягва блокирането на статуса и е винаги уникален.
  2. До първия curl_exec се изпълнява логване във Facebook с указаното потребителско име и парола. За да се избегне тежкия desktop ajax се представяме като много прост мобилен браузър. Така избягваме получаването на iOS/Android ajax версия която също е по-тежка за обработка. Кукитата се запазват във външен файл с цел последващо използване.
  3. Със втория curl_exec се насочваме към основната страница на Facebook където ще обновим статуса на потребителя.
  4. До третия curl_exec се изпълнява основната функция на обновяването. Проблема е че FB използва динамични форми и първо трябва да обработим втория резултат като вземем изключително важните параметри fb_dtsg – уникално id за формата и composer_form – сочещ към url-a който трябва да бъде извикан с третата заявка. Така композираме третата заявка която обновява статуса с няколко фиксирани параметъра.
  5. Последния ред затваряме curl и задачата е приключена. Можем да изтрием файла с cookies защото вече не е необходим.

С което задачата е изпълнена с няколко особенности:

  • Скрипта има проблеми с кирилицата! За момента не може да се публикува статус без да се счупи кирилицата. Тук проблема е по-тежък защото самия FB кара браузъра със специфично HTML поле “charset_test” да върне какво поддържа като езици и подозирам че нещо и оттам обърква кирилицата.
  • Скрипта се представя за мобилен агент което води до показването на “from mobile” под поста.
  • За момента показването на линкове не е много ефективно.
  • Не могат да се качват снимки във timeline.
  • Липсва проверка дали предходните операции са се случили безпроблемно. Например ако потребителското име/паролата са грешни не се спира изпълнението както и не се проверява дали обновяването на статуса минава безпроблемно.
  • Не може да се контролира видимоста на поста (Public/Friends/Me). Мисля че се използва настройката на потребителя.
  • Публикуването е фиксирано от името на човека и не може да се публикува от страница. Засега…

Надявам се със следващите версии да подобря част от недъзите на съществуващия скрипт. Системата е много гъвкава и на тази база може сравнително лесно да се направи подобен скрипт за публикуване във Twitter, Linkedin, Sharetronix, StatusNet и други подобни системи. Малко по-сложно ще е публикуването в Google+, но принципа е същия както в горните системи и не виждам причина да не бъде налична и тази социална мрежа.
С горния скрипт може да се направят много неща – примерно може да се настрои сървър да отчита параметрите си в интернет, може да се настрои автоматично постване през час от база данни, може да се извърши постване от името на потребител за вирална реклама и т.н. Общо взето възможностите са неограничени с тънкия момент, че не е много по правилата на Facebook. Ако трябва да бъде по правилата трябва да бъде приложение което потребителя с OAuth да упълномощи да извърши няколко дейности включително промяна на статуса.
За моя радост използвам скрипта САМО за лично ползване и то не и под основния ми акаунт. Ако имате въпроси ще бъда радостен да ви отговоря.

Posted in Linux, OSX, Windows | Tagged , | Leave a comment

Amazon Route53 – Cloud DNS for novices

В серия постове ще ви запозная с облачните услуги на Amazon. Сега ще ви покажа как се пуска облачен DNS в облака на Amazon. След фиаското с GoDaddy е по-добре да се прехвърлят сървърите в облачен DNS.

Сега ще ви демонстрирам как работи този домейн – nikolow.me на обикновен език. Amazon Route 53 поддържа облачни DNS сървъри и има много лесен административен панел - https://console.aws.amazon.com/route53/home Натискаме бутона “Created Hosted Zone”, в панела написваме името на зоната и коментар. За да управлявам зоната не се изпосва нищо преди домейна. Т.е. ако домейна е nikolow.me изписвам за име на зоната само nikolow.me! В никакъв случай не се изписва www. или mail. или нещо друго. Коментара е незадължителен, но препоръчителен – ако се управляват много повече от един домейн винаги става някаква невероятна каша. Затова в коментарите свободен текст можете да си опишете текст който после да го търсите по-лесно в полето за търсене. Когато зоната е готова от дясно ще се появят 4 DNS сървъра – това са сървърите на домейна. Тези сървъри трябва да се настроят в  регистратора самия домейн. Ако регистрираме нов домейн – в момента на регистрация, ако ще обновяваме съществуващ домейн е ще е по-добре първо да изпълним останалите стъпки преди да обновим тази информация в регистратора. В първия случай в момента на регистрирането домейна ще бъде стартиран без записи до момента на създаването им, което не е голям проблем за нови домейни. Проблем възниква във втория случай защото времето на обновяване на DNS сървърите отема от няколко часа до няколко дена – удобното е че дотогава едновременно и стария и новия DNS сървър и няма да се случи срив в обслужването на домейна.

След регистрацията на зоната е момента да прибавим самите записи – ако нямате опит е крайно препоръчително да прочетете малко относно материята! DNS не е за новаци, нито момента за научаване върху домейни които са реална употреба. Добре ще е да започнете с някакъв тестов домейн в този случай. Най-простото – всеки домейн има A записи с които се описват името на записа и се насочва към IP адрес. Пример всички са свикнали да пишат www.домейн затова правим запис www.домейн който да сочи към IP адреса на самия сървър. Отделно е хубаво да се направи запис за самия домейн (без префикс!) който пак да сочи към сървъра. Следващия запис който е задължителен е SOA – Amazon го попълва автоматично и ако не знаете какво правите е по-хубаво да не го пипате!  В дадения случай сочи към един от 4-те сървъра които обслужват домейна. Друг тип записи е MX – mail exchange това е запис описващ към останалите в публичното пространство кои са сървърите обслужващи входящата поща за съответния домейн. Заедно с MX вървят и SPF – те описват кои са разрешените MX записи за изпращане на мейл. Предназначението му е да се намали SPAM-а като изрично се опишат мейл сървърите. Ако сте параноици ще е хубаво да се направи и DKIM за съответния домейн което ще  удостовери и изпращача. Записите тип NS са други – те описват самите DNS сървъри на домейна. За наше щастие Amazon ги попълва автоматично и не е необходимо да се настройват допълнително.

Сега ще ви обясня и избрах Amazon:

  • сървърите са географски ограничени и се намират на различни IP адреси
  • обработката на заявките е бърза, за разлика от домейните на регистраторите които често са претоварени
  • (това е специфично за България) обработката на международни заявки е много бърза
  • позволява гъвкава настройка специфична за облачни услуги – Amazon позволява да се настроят допълнителни флагове и в зависимост от геолокацията да се връщат различни отговори
  • поддръжка на API – това позволява цялата дейност да се автоматизира

Сега и минусите:

  • услугата не е безплатна! В момента цените са $0.5 месечно за обработка на зона за първите 25 зони и $0.1 месечно за зоните над 25. Освен обработката на зони доставчика ни брои и броя на заявките закръглени на милион. Цената е $0.75 за милион заявки, ако заявките минат милиард за месец, цената става $0.375 което предполагам, че не би трябвало да е голям проблем в този случай.
  • има ограничение от 100 зони на акаунт, в момента не знам дали има ограничение на записите на зона

В крайна сметка борбата за ускоряване на достъпа до уеб включва и ускоряване на DNS защото това е първото което се случва при опит за достъп до сайта ви. Случвало се е времето на обработка на заявки да е около секунда което не може да се ускори по никакъв начин. При използване на облачни услуги времето на обработка на заявките спада драстично което е и нашата цел.

Posted in Admin | Tagged , , | Leave a comment

DisableProcessWindowsGhosting

Днес ще ви запозная с една интересна функция – DisableProcessWindowsGhosting ще ви покажа и как да се използва от Delphi. Ето какво е предназначението и… нека имаме процес който по някаква причина не може да си обработва опашката от съобщения. Той не може да я обработва, но има Windows Manager-a по някаква причина съумява да извършва следните дейности – resize, close, minimize на прозорците. Което разбира се води до още по-голям хаос когато процеса най-сетне съумее да обработи заявката.

За да се спре това поведение е разработена следната функция: DisableProcessWindowsGhosting в user32.dll която до спирането на процеса изключва тази особенност. Функцията е от най-любимите ми – нито има параметри, нито има резултат. Дефиницията на C e:

VOID WINAPI DisableProcessWindowsGhosting(void);

За първи път се среща в Windows XP (NT 5.1 SP1) и Windows 2003 (NT 5.2). Ето и примерен код на Delphi:

procedure DisableProcessWindowsGhosting;
var
DisableProcessWindowsGhostingProc: procedure;
begin
DisableProcessWindowsGhostingProc := GetProcAddress(
GetModuleHandle('user32.dll'), 'DisableProcessWindowsGhosting');
if Assigned(DisableProcessWindowsGhostingProc) then
DisableProcessWindowsGhostingProc;
end;

Понякога при използването на Delphi 7 под WinXP+ се получава странен проблем – ако се изведе модален прозорец със ShowModal и от този прозорец се изведе 2-ри модален (примерно с MessageDlg) се случва втория модален да се подпъхне между основния прозорец и първия модален. Което води до аматьорско поведение на приложението – решението е потребителя да натисне alt-tab и още веднъж alt-tab така, че приложението да изчертае наново всички прозорци коректно ИЛИ да се използва горния код.

Проблема възниква с приложения до Delphi7 и не може да се възпроизведе на Win2000 или WinNT поради бъг във VCL. Нямам представа дали вече проблема е отстранен в актуалните версии, носят се слухове че в Delphi 2006 проблема вече бил фиксиран на ниво VCL, но там проблемите са на малко идеологическо ниво. Според мен едва Delphi 2007 успява да стабилизира средата до някакво по-прилично ниво. Delphi 2005 и 2006 ще ги запомня с грандиозните сривания на самата среда и затова много разработчици останаха на старите и стабилни версии (5,6 и 7).

Posted in Windows | Tagged , , | 1 Comment

What is my ip address?

Как бързо да вземем на IP адреса на с който машината или мрежата е видима отвън:
curl ifconfig.me

А така може да се види и как се казва в интернет:
curl ifconfig.me/host

Невероятно полезен адрес за тестване на сайтове: www.ifconfig.me

Posted in Linux, OSX | Leave a comment

Add url to Baidu

Ето и прословутия линк за прибавяне на URL към Baidu.com: http://www.baidu.com/search/url_submit.html

Има и възможност за добавяне на sitemap, но китайския ми нещо куца и не можах да се оправя. Ето линк за повече подробности: http://www.gordonchoi.com/baidu-sitemap-20110422

Posted in SEO | Leave a comment

Unlock Alcatel OneTouch X220L or S220L or X220S

alcatel-onetouch-x220s-x220l-s220l

Сега ще ви покажа как да си отключите Alcatel OneTouch X220L или S220L бързо и лесно.

В моя случай използвам такъв 3G модем от Vivacom който е (т.е. беше) заключен към Vivacom, но ми се наложи да го използвам с карта на другите 2 оператора. Устройството изглежда като това от дясно с тази разлика че моето беше черно. На пазара се среща под три имена – X220L (като при мен), S220L или дори в собствената им документация и като X220S. Нямам никаква идея защо едно и също устройство се предлага в толкова много разновидности и под толкова много имена. Според мен всичките са еднакви и няма никаква разлика между тях.

Решението е много лесно:

1. Намирате IMEI на устройството – намира се на кутията му ИЛИ когато се отвори е написано на едно листче от вътрешната страна

2. Отивате тук - http://www.nextgenserver.com/calculator/

3. Избирате Alcatel Modem, после отдолу S220L, записвате IMEI номера отгоре, попълвате captcha-та и натискате бутона Order.

4. Номерата се генерират на момента. За всеки случай си ги запазете в един файл.

5. Слагате каква-да-е карта на друг оператор. Приложението ще ви поиска NCK кода. Подаваме го et voila! устройството вече работи с картите на 3-те оператора в България и навярно с оператори от целия свят.

Posted in Life | Tagged , | 3 Comments

iphone png revert

По време на компилацията с XCode на приложения се извършват и доста други странични дейности. Например plist файловете стават binary plist, PNG файловете се оптимизират и още други такива (не са предмет на разглеждане в момента).

Ако plist файловете може все пак да се обърнат обратно с помоща на командата plutil, това не е фатално защото всички редактори отварят и двата формата (XML/Binary). За PNG файловете обаче е фатално защото вече получения файл може да бъде задеден само на iOS и на нищо друго. Всички опити за отварянето на вече преобразуван файл под какъвто и да е инструмент пропада. Или дава грешка или файла се отваря, но с бял цвят. До вчера живях с илюзията, че процеса е необратим БЕЗ използване на външни програми специално създадени за целта. За моя радост обаче днес разбрах, че процеса е напълно обратим (с помоща на XCode!)! За целта трябва да се използва следната команда в терминала:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush
-revert-iphone-optimizations -q OptimizedPNG.png RevertedPNG.png

Това ще позволи файла OptimizedPNG.png да се върне в изходно състояние като RevertedPNG.png

Разбира се не съм чак толкова голям гений, ами го прочетох оттук:

http://iphonedevelopertips.com/xcode/undo-xcode-png-optimizations-using-pngcrush.html

Posted in iOS, OSX | Tagged , | Leave a comment

compiling libpng as universal binary for Mac OSX

Човек дори и добре да живее все някога опира до компилации на проекти с отворен код с цел последващо вграждане. Преди няколко дена ми се наложи да компилирам и libpng за да го вградя като статична библиотека в проект. Понеже проекта е universal binary (i386 и x86_64) ми трябва обаче и библиотеката да поддържа и двете архитектури. Компилация само за x86_64 или i386 не ми вършеше работа.
Затова се разтърсих и намерих следния скрипт:

./configure CFLAGS=”-arch i386 -arch ppc” CXXFLAGS=”-arch i386 -arch ppc” –disable-dependency-tracking

Понеже на мен ppc не ми трябваше просто го замених с x86_64 и скрипта изглеждаше така:

./configure CFLAGS=”-arch i386 -arch x86_64″ CXXFLAGS=”-arch i386 -arch x86_64″ –disable-dependency-tracking

После правим един бърз make и резултатния файл се намира тук .libs/libpng12.a За всеки случай пишем:

$lipo -info .libs/libpng.a
Architectures in the fat file: .libs/libpng.a are: i386 x86_64

И резултата е че имаме универсална библиотека с поддръжка на i386 и x86_64!
Posted in OSX | Tagged , | Leave a comment