PDA

Просмотр полной версии : авторизация вконтакте


rudra
15.03.2009, 16:31
Начал писать скрипт для контакта, но тут же встал затык с авторизацией:
#!/usr/bin/python

import cgi
import urllib2
import Cookie
import md5

def main():
print "Content-type: text/html\n"

id = подставь id
name = подставь мыло
passw = подставь пароль
md5passw = md5.new(passw)

url = 'http://vkontakte.ru/id' + id
req = urllib2.Request(url)
req.add_header = ('User-Agent', "Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)")
req.add_header('Cookie', "remixpass=" + md5passw + ";remixemail" + name + ";remixmid" + id)
f = urllib2.urlopen(req)

print f.read()

main()

Благодарю за ценный совет.

Kaimi
15.03.2009, 16:59
Без remixsid авторизоваться не получится, поэтому шли пост запрос к серверу на авторизацию

rudra
15.03.2009, 18:53
типо такого? У меня не работает. Вываливает страницу с авторизацией, но значения не передает.
data = {'email':name, 'pass':passw}
params = urllib.urlencode(data)
url = 'http://vkontakte.ru/login.php'
req = urllib2.Request(url, params)
req.add_header = ('User-Agent', "Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)")
f = urllib2.urlopen(req)
print f.read()

rudra
16.03.2009, 01:19
господа, кто-то может подсказать, что не так? Очень хочется разобраться.

Kaimi
16.03.2009, 11:39
Вываливает страницу с авторизацией, но значения не передает

Может там капча появляется...

rudra
16.03.2009, 11:49
Не. Капчи на логине не видел(((

Kaimi
16.03.2009, 12:30
Видимо контакт отдает кукисы и редиректит. Скрипт кукисы отбрасывает и следует по редиректу, в результате получаешь ответ в виде страницы авторизации

rudra
16.03.2009, 12:56
эм... это идея! Надо попробовать скормить странице с логином те же куки, что приходят по запросу главной страницы вместе с постом

rudra
18.03.2009, 23:21
Добрался сегодня вечером до скрипта. Нифига. Получаю куки от страницы login.php, скармливаю их же, но уже с постом авторизации. Так вообще страницу не грузит... токмо без кук.

Kaimi
18.03.2009, 23:46
Какой пост авторизации после получения кукисов если ты кукисы с пост запроса должен получить и использовать их для перехода по внутренним страницам

rudra
18.03.2009, 23:57
ща пробанем.
Странные какие-то куки:
remixlang=1; expires=Thu, 18-Mar-2010 20:02:53 GMT; path=/; domain=.vkontakte.ru, remixchk=5; expires=Sat, 20-Mar-2010 22:32:00 GMT; path=/; domain=.vkontakte.ru, remixchk=5; expires=Sat, 27-Mar-2010 22:27:53 GMT; path=/; domain=.vkontakte.ru, remixchk=5; expires=Fri, 12-Mar-2010 18:03:06 GMT; path=/; domain=.vkontakte.ru

rudra
19.03.2009, 00:25
пипец. сменили пароль к моей анкете... Не могу авторизироваться. Хотя, анкеты есть

dvion
19.03.2009, 01:00
rudra,
Шлёшь log + pass на login.php
Если всё окей - то он сделает редирект (302, location), тогда можешь забирать куку.
Если редирект не сделал, то либо капча, либо вообще лог+пасс кривой.

Теперь насчёт куки - remixsid уже месяца 3-4 обязательный параметр в куках, а вот всё остальное - мусор (ну, за исключением тех случаев, когда нужно стырить акк).
Так что можешь смело брать только remixsid, его вообще можно один раз получить и год пользоваться. Пока пасс, конечно, старый ;)

___
дополнение:

можно быстро чекать приготовленные куки очень быстрым способом:
обращаться к vkontakte.ru с кукой, после чего смотреть, идёт ли 302 с location или нет ;)
скорость + экономия + акк в он-лайн не вылетает, что тоже важно (при запросе vkontakte.ru с правильной кукой делается редирект на profile.php (он же idX)).

rudra
19.03.2009, 01:07
ага. Принцип ясен. Я постом получаю с логин.пхп куку с remixsid и дальше скармливаю ее, например, странице своей анкеты.
Спасибо. Буду пробовать написать такое. Когда получится, выложу сорцы

gold-goblin
19.03.2009, 01:08
http://forum.devisible.ru//showthread.php?t=297
посмотри тут мой бот. Только парсинг страници фигово реализовал (с ошибкой) и для аостинга надо куча данных

De-visible
19.03.2009, 01:25
Скандалы интриги расследования??? ппц код в первом посте, я пока не в cgi, переделать труда не составит думаю.


def LoginsContact(nickname,password):
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(c ookie))
urllib2.install_opener(opener)
headers = {"User-Agent" : "Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)" }
data_s = {"email":nickname, "pass":password}
send_data = urllib.urlencode(data_s)
u_request = urllib2.Request("http://vkontakte.ru/login.php", send_data, headers)
try:
vk = str(urllib2.urlopen(u_request).info())
except:
cookie = status = "ERROR"
return cookie, status
else:
if "remixsid=deleted" in str(vk):
status = "NO"
return cookie, status
else:
status = "YES"
return cookie, status

rudra
19.03.2009, 01:33
жирок!

rudra
19.03.2009, 16:59
добрался до отправки запроса на дружбу. Вот код хтмл: <li><a href="mail.php?act=write&to=2300774">Отправить сообщение</a></li><li><a href="friend.php?id=2300774">Друзья Женечки</a></li><li><a href="#add" onclick="addToFriend(2300774); return false;">Добавить в друзья</a></li>

Из этого сделал вывод, что запрос на авторизацию должен выглядеть вот так:
"http://vkontakte.ru/addToFriend(" + id + "); return false;"
Но в результате не видно вот той шняги, которую только недавно ввели и где есть кнопка "добавить"

wildshaman
19.03.2009, 17:10
onclick="addToFriend(2300774); return false;"



Это е надо приписывтаь к урлу. Это javascript.

Смотри запрос, напрмиер, плагином live http headers для firefox

rudra
19.03.2009, 22:20
интересный плагин. Вот какой результат:
1. Запрос при запросе на дружбу(который открывает окошко):
POST /friend.php act=a_add_form&fid=795186
2. Запрос при отправки формы из окошка:
POST /friend.php act=addFriend&fid=795186&h=1367d519&first_name=%D0%AE%D0%BB%D0%B8%D1%8F&last_name=%D0%A0%D0%B0%D0%B5%D0%B2%D1%81%D0%BA%D0% B0%D1%8F&sex=%D0%B0&message=Privet

Я думаю, что можно сразу использовать второй запрос. Получается:
/friend.php act=addFriend&fid=IDЖЕРТВЫ&h=1367d519&first_name=ИМЯ&last_name=ФАМИЛИЯ&sex=ПОЛ&message=МЕССАДЖ_КАМРАДУ
Но одна непонятка. Что это за число? 1367d519
Просто рандомное??? Не совсем рандомное. Каждому юзеру идет свое. И при повторе запроса оно одинаковое.

m0Hze
20.03.2009, 01:49
Могу смело заявить что параметр sid в куках можно обходить,если знать как.Это просто к сведению.Скрипт работает уже больше полугода,и пока что все работает.Генерирую кукисы сам,ну а затем по мелочи.имха.

dvion
20.03.2009, 02:28
m0Hze,
Sid - алгоритмизационный параметр?

rudra
20.03.2009, 02:48
господа хакеры, объясните начинающему как такое может быть
addEx = re.compile(r'(\w+aeb)')
for m in re.finditer(addEx, response):
num = m.start()
print response[num-20:num+20]
Выдает: \" id=\"h\" value=\"b41aeb7a\">\n <
где b41aeb7a искомый номер

Теперь я знаю что искать. Беру поиск чтобы получить это число:
addEx = re.compile('(?<=value=\\\")\w+')
hits = addEx.findall(response)
print hits
Но в результате ничего не получаю!!! Это как?

inlanger
20.03.2009, 11:51
А я так логинюсь:

#!/usr/bin/env python
# -*- coding: cp1251 -*-
import urllib
import urllib2

urllib2.install_opener(urllib2.build_opener(urllib 2.HTTPCookieProcessor))
params = urllib.urlencode({'email' : "login@login",'pass': "pass"})
request = urllib2.Request('http://vkontakte.ru/login.php', params)
f = urllib2.urlopen(request)

cookie = f.headers
print cookie

rudra
20.03.2009, 11:56
так это ж тоже самое...

inlanger
20.03.2009, 12:17
мой вариант немного легче :)

rudra
20.03.2009, 12:26
эт, конечно, хорошо. Но как достучаться до значения value? Из этой же формы id найти можно, кстати

inlanger
20.03.2009, 13:18
S = '\" id=\"h\" value=\"b41aeb7a\">\n <'

S = S.replace('\" id=\"h\" value=\"', '')
S = S.replace('\">\n <', '')

я так делал, работало :)
в итоге у тебя в S остаётся только начение value

rudra
20.03.2009, 13:23
не понял. Можешь объяснить? Есть в форме поле value. Найти его значение не могу. Значение id из той же формы находится. Для поиска значения юзаю:
addEx = re.compile('(?<=value=)\w+')
hits = addEx.findall(response)
print hits

ЗЫ: ща попробую

rudra
20.03.2009, 13:27
response = str(urllib2.urlopen(req).read())
s = responce.replace('\" id=\"h\" value=\"', '')
s = s.replace('\">\n <', '')
print s

вот так вообще не работает

inlanger
20.03.2009, 13:27
Если ты точно мужду чем находится искомое значение то тупо отбрось лишнее через replace(). Я делал замену текста на пустое значение, то есть - просто удалял лишнее.

rudra
20.03.2009, 13:31
а! Так в том-то и беда! Я когда беру вот это значение из формы и вбиваю руками, оно его находит. А когда я беру имя поля, в котором должно быть это значение, то поле оказывается пустым.

_nic
21.03.2009, 20:12
Такой вопрос ,может кто то сталкивался:Допустим шлю пост запрос через прокси получаю в ответ заголовок с куками.Так вот если я буду для ускорения процесса слать уже гет с нужными куками без прокси капчу будет выкидывать или нет?

dvion
21.03.2009, 20:43
_nic,
Что в конечном итоге надобно получить? Если кука есть - то и логиниться не нужно. А следовательно, и GET делать не нужно. Такая вот логика, если вопрос рассматривать так, как он описан.

_nic
21.03.2009, 21:49
Я все ясно написал.Шлю пост с мылом\паролем через прокси ,если верно получаю ответ с редиректом и куками.Потом шлю гет что бы получить инфу о анкете.Так вот если гет будет идти не через прокси,то будет капчу кидать после допустим 1000го раза, или нет?

rudra
22.03.2009, 16:21
Вернемся к баранам. Все хорошо кроме одного. Не могу выципить из формы приглашения имя и фамилию, если они кириллицей написаны. Латиницей ок, а кириллицей йок.

Попробовал сделать вот так:
ru = lambda x: unicode(x,'cp1251')
test = ru(response[500:700])
addEx = re.compile('(?<!<\/a>)\w+')
hits = addEx.findall(test)
print hits

Все равно не видит русского имени

rudra
22.03.2009, 16:40
заработало! Все ок. Приглашает.

хехе. Рано я обрадовался. Ошибка безопасности, нах.

rudra
22.03.2009, 21:02
господа, нужна ваша помощь. Есть ссылочка на добавление в друзья. Когда ее выполняю просто в браузере, то все норм, когда отсылаю скриптом, то ошибка безопастности. Смотрел через файерфокс хттп_заголовки, но там ничего более не передается. Сегодня днем еще через скрипт все срабатывало. Кто может подсказать, что не верно я контакту скармливаю:

url = 'http://vkontakte.ru/friend.php?act=addFriend&fid=795186&h=1367d519&first_name=%D0%AE%D0%BB%D0%B8%D1%8F&last_name=%D0%A0%D0%B0%D0%B5%D0%B2%D1%81%D0%BA%D0% B0%D1%8F&sex=%D0%B0&message='
req = urllib2.Request(url)
req.add_header("Referer", "http://vkontakte.ru/search.php?q=%E4%EC%E8%F2%F0%E8%E9+FX&act=quick")
req.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5")
response = str(urllib2.urlopen(req).read())

rudra
22.03.2009, 22:58
вот. Родил. Мой первый скрипт в веб-программинге. Работает :)
#!/usr/bin/python

import cgi
import urllib
import urllib2
import re
import cookielib
import time

def loginContact(nickname, password):
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(c ookie))
urllib2.install_opener(opener)
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)'}
data = {"email":nickname, "pass":password}
sendData = urllib.urlencode(data)
req = urllib2.Request("http://vkontakte.ru/login.php", sendData, headers)

try:
vk = str(urllib2.urlopen(req).info())
except:
cookie = status = "ERROR"
return cookie, status
else:
if "remixsid=deleted" in str(vk):
status = "NO"
return cookie, status
else:
status = "YES"
return cookie, status

def openSearch():
searchURL = "http://vkontakte.ru/search.php?q=%EA%E8%E5%E2&act=quick"
req = urllib2.Request(searchURL)
response = str(urllib2.urlopen(req).read())
addEx = re.compile('(?<=addToFriend\()\w+')
ids = addEx.findall(response)

return ids

def addFriend(ids):
urlArray = []

for id in ids:
friendURL = "http://vkontakte.ru/friend.php?act=a_add_form&fid=" + id
urlArray.append(friendURL)

for urlNum in range(1, len(urlArray)):
searchURL = urlArray[urlNum]
req = urllib2.Request(searchURL)
response = str(urllib2.urlopen(req).read())

addEx = re.compile('(?<=\")\w+')
hits = addEx.findall(response[850:950])

for i in range(0, len(hits)):
if hits[i] == 'h' and hits[i + 1] == 'h':
value = hits[i + 2]
break

addEx = re.compile('(?<!<\/a>)\w+', re.UNICODE)
hits = addEx.findall(response[500:700])

for i in range(0, len(hits)):
if hits[i] == ids[urlNum]:
firstName = hits[i + 1]
lastName = hits[i + 2]
break

url = 'http://vkontakte.ru/friend.php?act=addFriend&fid=' + ids[urlNum] + '&h=' + value + '&first_name=' + firstName + '&last_name=' + lastName + '&sex=&message='
req = urllib2.Request(url)
urllib2.urlopen(req).read()

time.sleep(2.5)

return responce


def main():
print "Content-type: text/html\n"

inputValue = cgi.FieldStorage()
name = inputValue["name"].value
passw = inputValue["pass"].value
go = loginContact(name, passw)

if go[1] == 'YES':
addFriend(openSearch())

main()

termit
06.05.2009, 13:09
авторизацию замудрили пипец, кто ни будь на пхп замутит?

Dark_Scorpicore
08.05.2009, 21:34
авторизацию замудрили пипец, кто ни будь на пхп замутит?
Чё там мутить-то?
<?php
$mail='mail'; //эмеил
$pass='111111'; //пароль
$id='111111'; //id

$cookie='remixmid='.$id.'; remixemail='.$mail.'; remixpass='.md5($pass).';remixlang=3;';
?>

Кусок, грабящий значение хэша
$begin = 'name="hash" value="';
$begin = strpos($res, $begin) + strlen($begin);
$end = '"';
$end = strpos($res, $end, $begin);
$toid = substr($res, $begin, $end - $begin);


$begin нужно отредактить немного