|
|
게시됨 2015. 2. 13. 오후 10:44:10
|
|
|
|

|
0×00 배경
빨간 봉투는 어떤가요? 그의 형제의 아들 후어는 "돈이 거의 비슷하다. 형제와 딸 다오윈이 말했다, "바람 때문에 이모만큼 좋지 않아." "모두가 배경을 이해하지, 오늘은 새해고, 빨간 봉투가 하늘을 가득 날리는 날이야. 마침 이틀 전에 파이썬을 배웠고, 더 신나서 웨이보 홍봉투 기어 다니는 법을 계속 공부했어요. 왜 알리파이 홍봉투 대신 웨이보 홍봉투를 썼는지, 웹만 이해하고, 에너지가 있으면 나중에 두더지 잡기 알고리즘도 공부할지도 모르겠다고 생각했어요. 저는 파이썬 초보자이기 때문에, 이 프로그램은 파이썬을 배운 후 세 번째로 작성한 프로그램이기도 합니다. 그래서 코드에 구멍이 있으면 직접 파고들지 말아 주세요. 초점은 아이디어에 있습니다. 만약 아이디어에 구멍이 있다면, 직접 파고들지 마세요. IE는 기본 브라우저로 스스로 설정할 수 있는 페이스가 있고, 쓰레기 기사를 쓰는 것도 괜찮습니다...... 저는 Python 2.7을 사용하는데, Python 2와 Python 3 사이에 큰 차이가 있다고 합니다.
0×01 아이디어 말로 설명하기가 너무 귀여워서 스케치를 그렸고, 모두가 이해할 수 있을 거라고 생각했어요.
우선, 옛날 규칙입니다. 먼저 유용한지는 모르지만 없으면 안 되는 라이브러리를 소개하는 것입니다: [mw_shl_code=java,true]import re, urlib, urllib2, cookieliv, base64, binascii, os, json, json, sys, cPickle, as p import, rsa[/mw_shl_code] 그 다음 나중에 사용해야 할 다른 변수들을 선언하세요:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]여기에는 기본적으로 Python에 포함되지 않은 RSA 라이브러리가 사용됩니다. 설치해야 해요 :https://pypi.python.org/pypi/rsa/
다운로드를 마치고 설치 setpy.py 실행한 후 개발 단계를 시작할 수 있습니다.
0×02 웨이보 로그인 빨간 봉투를 집는 동작은 로그인 후에 수행되어야 하므로 로그인 기능이 있어야 하며, 로그인이 핵심이 아니라 쿠키 보존이 핵심이며, 여기서는 cookielib의 협력이 필요합니다. [mw_shl_code=java, true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] 이렇게 하면 오프너를 사용하는 모든 네트워크 작업이 쿠키 상태를 처리합니다. 저는 잘 모르지만 정말 훌륭합니다. 다음으로, 두 개의 모듈을 캡슐화해야 합니다. 하나는 데이터 수집 모듈로, 단순히 데이터를 얻는 데 사용하고, 다른 하나는 데이터를 POST 처리하는 데 사용됩니다. [mw_shl_code=java,true]def getData(url) : try: req = urllib2. Request(url) 결과 = opener.open(req) text = result.read() text=text.decode("utf-8").encode("gbk",'ignore') 텍스트는 예외를 제외하고 반환됩니다. e: print u' request exception, URL: '+URL print e def postData(URL,data,header) : try: data = urllib.urlencode(data) req = urllib2. Request(url, data, header) 결과 = opener.open(req) text = result.read() 예외를 제외한 텍스트 반환, e: print u'request exception, url: '+url[/mw_shl_code] 이 두 모듈로 데이터를 얻고 POST할 수 있는데, getData가 디코딩 후 인코딩하는 이유는 Win7에서 디코딩할 때 출력이 항상 뒤섞여서 인코딩 처리를 추가했기 때문입니다. 이게 핵심은 아니고, 아래 로그인 기능은 웨이보 로그인의 핵심입니다. [mw_shl_code=java,true]def login(nick, pwd): print u"----------login----------" print "----------......----------" prelogin_url= 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_= 1400822309846' % nick preLogin = getData(prelogin_url) servertime = re.findall('"servertime":(.+?),' , preLogin)[0] pubkey = re.findall('"pubkey":"(.+?)",', preLogin)[0] rsakv = re.findall('"rsakv":"(.+?)",' , preLogin)[0] nonce = re.findall('"nonce":"(.+?)",', preLogin)[0] #print bytearray('xxxx','utf-8') su = base64.b64encode(urllib.quote(nick)) rsaPublickey= int(pubkey,16) key = rsa. PublicKey(rsaPublickey,65537) message = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) 헤더 = {'User-Agent' : 'Mozilla/5.0 (호환; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'} param = { 'entry': 'weibo', 'gateway': '1', 'from': '', 'savestate': '7', 'userticket': '1', 'ssosimplelogin': '1', 'vsnf': '1', 'vsnval': '', 'su': su, 'service': 'miniblog', 'servertime': servertime, 'nonce': nonce, 'pwencode': 'rsa2', 'sp': sp, 'encoding': 'UTF-8', 'URL': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', 'returntype': 'META', 'rsakv' : rsakv, } s = postData('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)',param,header) try: urll = re.findall("locatio remove n.replace\(\'(.+?) \'\); " , s)[0] login=getData(urll) print u"--------- 로그인 성공! "print" ----------......---------- "예외 제외, e: print u" ------- 로그인 실패--------- -------" print "----------......----------" exit(0)[/mw_shl_code]이 문서의 매개변수와 암호화 알고리즘은 인터넷에서 복사한 것이고, 잘 이해가 안 됩니다. 아마도 먼저 타임스탬프와 공개키를 요청한 뒤, RSA 암호화를 거쳐 처리를 처리한 뒤 Sina 로그인 인터페이스에 제출하는 방식일 것입니다. Sina에서 성공적으로 로그인하면 웨이보 주소를 반환합니다. 로그인 상태가 완전히 발효되도록 요청해야 합니다. 로그인이 성공적으로 이루어진 후, 이후 요청은 현재 사용자의 쿠키를 전달하게 됩니다.
0×03 지정 빨간 봉투 추첨 웨이보에 성공적으로 로그인한 후, 우선 브라우저에서 빨간 봉투를 찾아서 먼저 시도해보고 싶어 정말 기대됩니다. 마침내 빨간 봉투 버튼이 있는 페이지를 발견했고, F12가 디버거를 호출해 데이터 패킷이 무엇을 요청하는지 확인했습니다.
요청 주소가 http://huodong.weibo.com/aj_hongbao/getlucky 있고, 두 가지 주요 매개변수가 있는데, 하나는 ouid, 즉 빨간 봉투 ID로, URL에서 확인할 수 있습니다. 다른 하나는 공유 매개변수로 웨이보에 공유할지 여부를 결정하며, _t 용도는 모르겠습니다. 이론적으로는 이 URL에 세 가지 매개변수를 제출하면 빨간 봉투 추출을 완료할 수 있지만, 실제로 매개변수를 제출하면 서버가 마법처럼 다음과 같은 문자열을 반환해 줍니다: [mw_shl_code=자바, 참] {"code":303403,"msg":"죄송하지만, 이 페이지에 접근할 권한이 없습니다","data":[]}[/mw_shl_code] 지금 당황하지 마세요. 제 다년간의 웹 개발 경험에 따르면, 상대방 프로그래머가 참조자를 판단해야 합니다. 아주 간단합니다. 과거 요청의 모든 헤더를 복사하는 것뿐입니다. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw red envelope from:"+str(id)+"---" print "----------......----------" checkValue(id)==False: #不符合条件, 이것은 나중에 반환하는 함수입니다 luckyUrl="http://huodong.weibo.com/aj_hongbao/getlucky" param={ 'ouid':id, 'share':0, '_t':0 } 헤더= { '캐시-제어':'no-cache', 'Content-Type':'application/x-www-form-urlencoded', 'Origin':'http://huodong.weibo.com', 'Pragma':'no-cache', 'Referer': 'http://huodong.weibo.com/hongbao/'+str(id), 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, Gecko처럼) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, 헤더)[/mw_shl_code] 이 경우 이론상은 문제가 없지만, 실제로는 문제가 없습니다. 복권 액션이 완료된 후에는 상태를 판단해야 하며, 반환된 res는 json 문자열입니다. 여기서 코드가 100000이면 성공이고, 90114이면 오늘 복권의 상한선이며, 다른 값들도 실패한 것입니다. 따라서 다음과 같습니다: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"---------가 상한에 도달했습니다---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------번영을 기원합니다---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) 만약 hbRes["data"] and hbRes["data"]["title"]: print hbRes["data"]["title"] print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])else: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], 여기서 log는 제가 커스터마이즈하는 함수로, 로그를 기록하는 데 사용됩니다: [mw_shl_code=java,true]def log(type,text): fp = open(type+'.txt','a') FP.write(text) FP.write('\r\n') FP.Close()[/mw_shl_code]
|
이전의:PHP 업로드 최대 제한에 관한 노트다음:PHP5.2, 5.3, 5.4, 5.5용 memcache dll 확장 프로그램 다운로드
|