Tuesday, August 31st, 2010
Собственно рабочая функция проверки Google Page Rank :
import urllib, sys
def get_pagerank(url):
hsh = check_hash(hash_url(url))
gurl = 'http://www.google.com/search?client=navclient-auto&features=Rank:&q=info:%s&ch=%s' % (urllib.quote(url), hsh)
try:
f = urllib.urlopen(gurl)
rank = f.read().strip()[9:]
except Exception:
rank = 'N/A'
if rank == '':
rank = '0'
return rank
def int_str(string, integer, factor):
for i in range(len(string)) :
integer *= factor
integer &= 0xFFFFFFFF
integer += ord(string[i])
return integer
def hash_url(string):
c1 = int_str(string, 0x1505, 0x21)
c2 = int_str(string, 0, 0x1003F)
c1 >>= 2
c1 = ((c1 >> 4) & 0x3FFFFC0) | (c1 & 0x3F)
c1 = ((c1 >> 4) & 0x3FFC00) | (c1 & 0x3FF)
c1 = ((c1 >> 4) & 0x3C000) | (c1 & 0x3FFF)
t1 = (c1 & 0x3C0) << 4
t1 |= c1 & 0x3C
t1 = (t1 << 2) | (c2 & 0xF0F)
t2 = (c1 & 0xFFFFC000) << 4
t2 |= c1 & 0x3C00
t2 = (t2 << 0xA) | (c2 & 0xF0F0000)
return (t1 | t2)
def check_hash(hash_int):
hash_str = '%u' % (hash_int)
flag = 0
check_byte = 0
i = len(hash_str) - 1
while i >= 0:
byte = int(hash_str[i])
if 1 == (flag % 2):
byte *= 2;
byte = byte / 10 + byte % 10
check_byte += byte
flag += 1
i -= 1
check_byte %= 10
if 0 != check_byte:
check_byte = 10 - check_byte
if 1 == flag % 2:
if 1 == check_byte % 2:
check_byte += 9
check_byte >>= 1
return '7' + str(check_byte) + hash_str
print get_pagerank("http://twitter.com")
Posted in Code, Python | 1 Comment »
Monday, June 21st, 2010
Бывает необходимо замерить время выполнения скрипта или функции. Сделать это можно следующим образом :
start = time.time()
function_name()
print "Elapsed Time: %s" % (time.time() - start)
function_name() <<—- функция время выполнения которой нужно замерить
Posted in Code | 2 Comments »
Wednesday, May 5th, 2010
Часто встречаются ресурсы где текст вводится в яваскрипт боксе. Т.е. элемента к которому можно обратиться средствами Human Emulator’а как бы нет. Однако если использовать Firebug можно обнаружить, что набираемый текст появляется внутри каких либо тегов.
Т.е. фактически его можно просто туда вставить, делается это слудующим образом:
/* <div id="test1"><div id="test2"></div></div> */
function str_insert($insertstring, $intostring, $offset) {
$part1 = substr($intostring, 0, $offset);
$part2 = substr($intostring, $offset);
$part1 = $part1 . $insertstring;
$whole = $part1 . $part2;
return $whole;
}
$elem = "tst2"
$page = $webpage->get_body();
$pos = strpos($page, $elem);
$page = str_insert("Hello Kitty", $page, $pos + strlen($elem) + 1);
$webpage->set_body ($page);
$browser->wait_for(10,1);
подмена страницы =) Думаю идея понятна.
Posted in Human Emulator | 3 Comments »
Monday, May 3rd, 2010
Продолжая монологи про HumanEmulator дам совет о том, как сделать более-менее универсальный шаблон для создания регистраций. Ведь по сути выполняются одни и те же дейсвия : “Зайти сюда, заполнить поля, щелкнуть эту кнопку”. Это естественно касается именно процесса регистрации, далее все равно придется писать код “как положенно”.
$fields = array(
"input:name" => $name,
"input:mail" => $gmail,
"input:conf_mail" => $gmail,
"input:profile_url" => "http://google.com",
"cptch:4" => "recaptcha_response_field", // cptch - image number, value = field name
"checkbox:og_register[1750]" => True,
"textarea:profile_description" => $bio,
"confirm:button" => "op"
);
Это что-то вроде правила для заполнения полей. Далее пишем функцию _register() которая заполняет поля форм согласно правилу. Функция естественно “демо”, её задача дать базовое представление о том, как это всё будет работать.
function _register($fields) {
include("include_all.php");
foreach ($fields as $key=>$value) {
$split = explode(':', $key);
$param_field = $split[0];
$param_name = $split[1];
switch ($param_field) {
case "input" :
$input->set_focus_by_name($param_name);
$input->set_value_by_name($param_name, $value);
break;
case "cptch" :
$captcha = $app->dlg_captcha_from_image_number($param_name);
$input->set_focus_by_name($value);
$input->set_value_by_name($value, $captcha);
break;
case "listbox" :
$list_size = $listbox->get_length_by_name($param_name);
$rnd_elem = rand(1, $list_size - 1);
if ($list_size > 50) {
$rnd_elem = 80;
}
$listbox->select_num_value_by_name($param_name, $rnd_elem);
echo "
\n\n\n";
echo "List name : $param_name List size : $list_size Elem : $rnd_elem \n\n";
break;
case "confirm" :
switch ($param_name) {
case "button" :
$browser->wait(1);
sleep(rand(1,3));
$button->click_by_name($value);
break;
case "btn" :
$browser->wait(1);
sleep(rand(1,3));
$btn->click_by_number($value);
break;
}
break;
case "checkbox" :
$checkbox->click_by_name($param_name);
break;
case "textarea" :
$textarea->set_value_by_name($param_name, $value);
break;
}
}
}
В итоге сам процесс регистрации :
$browser->navigate($url);
$browser->wait(1);
sleep(rand(1,3));
$anchor->click_by_inner_text("Register", true);
$browser->wait(rand(2,6));
_register($fields);
gmail_confirmer($gmail, $pass, 'http://www.site.com/validate/', "site registration");
Используется функция gmail_confirmer о которой можно прочитать в предыдущей статье посвещянной использованию HumanEmulator’а. Весь код как говориться “very basic”, но идею уловить можно и переписать код под свои задачи.
Posted in Code, Human Emulator | 2 Comments »
Tuesday, April 20th, 2010
Речь пойдет о такой замечательно программе, как Human Emulator. Мне кажется это оптимальное сочетание простоты и скорости написания небольших скриптов с довольно мощьным функционалом. На нем даже можно написать полоноценную спамилку. Вообщем продукт безусловно хороший и полезный, свою стоимость он оправдывает на 100%.
Программировать на Human Emulator – легко, но как всегда есть типовые задачи для которых неплохо было бы иметь сниппеты. Итак сниппет первый – автоконфирмер регистрацый которые приходят на ящик gmail. Суть проста – любой кодер без проблем уловит идею и перепишет как ему нужно.
Вызывается примерно так
gmail_confirmer($gmail, $pass, 'http://............./validate/', "Welcome to site ....");
Как видно 3ий параметр это с чего начинается строчка на которую нужно кликнуть, чтобы подтвердить регистрацию, а 4ый – это заголовок приходящего e-mail.
function gmail_confirmer($usr_mail, $usr_pass, $site_url, $search_str) {
include("include_all.php");
init_browser();
$browser->wait(3);
sleep(rand(1,3));
$browser->navigate("gmail.com");
$browser->wait(2);
$input->set_focus_by_name("Email");
$input->set_value_by_name("Email", $usr_mail);
$browser->wait(2);
$input->set_focus_by_name("Passwd");
$input->set_value_by_name("Passwd", $usr_pass);
$browser->wait(2);
$button->click_by_name("signIn");
$browser->wait(rand(2,6));
$anchor->click_by_inner_text("basic HTML", false);
$browser->wait(rand(2,6));
$anchor->click_by_inner_text($search_str, false);
$browser->wait(rand(2,6));
$urls = $anchor->get_all_urls();
$urls = explode("", $urls);
$url = array_find($site_url, $urls);
//$debug->message_box($url);
$browser->wait(3);
$browser->navigate($url);
$browser->wait(3);
return true;
}
Несколько пояснений include(“include_all.php”); – для того чотбы без проблем использовать объекты Human Emulator внутри функций. Выглядит файл примерно так :
// Yo
global $browser;
global $anchor;
global $input;
global $listbox;
global $button;
global $radiobox;
global $checkbox;
global $debug;
global $textarea;
global $inputimage;
global $captcha;
global $webpage;
global $app;
global $init_browser;
global $textfile;
global $btn;
global $inputfile;
global $debug;
global $frame;
global $form;
init_browser(); – инициализирует браузер. тут можно делать что угодно, очищать куки, делать рефреш.
Posted in Code, Human Emulator | 4 Comments »