#encoding=utf-8 |
import urllib2 |
import httplib |
import urllib |
import cookielib |
import urllib2 |
import socket |
import json |
import ssl |
from xml.dom.minidom import parseString |
import time |
from sgmllib import SGMLParser |
import re |
|
|
timeout = 40 |
socket.setdefaulttimeout(timeout) |
sleep_download_time = 10 |
time.sleep(sleep_download_time) |
|
def link_server(host): |
""" link server |
|
Args: |
host: host name |
|
Returns: |
None |
""" |
try : |
httpClient = httplib.HTTPSConnection(host, 443 , timeout = 60 ) |
except Exception, e: |
print e |
|
def request_server(httpClient, url, body, headers, method): |
""" request server |
|
Args: |
httpClien : HTTPSConnection |
url : a str indicating host_url |
body : a str indicating send content |
headers : a dict object |
return : a response object indicating response from server |
|
Return: |
response: reponse object |
|
""" |
try : |
httpClient.request(method, url, body, headers) |
except Exception, e: |
print e |
return httpClient.getresponse() |
|
def auth_check(response, hostName, isServerRight, isLoginSuccess): |
""" check whether login is successful |
|
when server responses the right xml file, it indicates the successful login operation |
|
Args: |
response: response objects saving the data from server and other params |
hostNmae: a str indicatinghost name |
isServerRight: a boolean data indicating whether host name is right for this id to login |
isLoginSuccess: a boolean data indicating whetheh login is successful |
|
Return: |
hostNmae: a str indicatinghost name |
isServerRight: a boolean data indicating whether host name is right for this id to login |
isLoginSuccess: a boolean data indicating whetheh login is successful |
|
Raise: |
None |
|
""" |
resp_content = response.read() |
xml_obj = parseString(resp_content) |
login_info = xml_obj.getElementsByTagName( 'key' ) |
value = login_info[ 0 ].childNodes[ 0 ].data |
#login the wrong server, turn to the right one |
if cmp (value, "appleId" ) = = 0 : |
location = response.getheader( "location" ) |
#location:https://p*-buy.itunes.apple.com//WebObjects/MZFinance.woa/wa/authenticat?Pod=59&PRH=59 |
hostName = location.split( '/' )[ 2 ] |
print 'linking to the correct server:' , location.split( '/' )[ 2 ] |
isServerRight = False |
#login failed |
elif cmp (value, "accountInfo" ) ! = 0 : |
fail_info = xml_obj.getElementsByTagName( 'string' )[ 1 ].childNodes[ 0 ].data |
print fail_info |
#login success |
else : |
isLoginSuccess = True |
file = open ( "login_file.xml" , "w" ) |
file .write(resp_content) |
file .close() |
return isLoginSuccess, isServerRight, hostName |
|
def get_user_information(response, appleId): |
""" get user information |
|
Args: |
response: response objects saving the data from server and other params |
appleId: a int indicating the login id |
|
Return: |
cookie: a str indicating cookies |
token: a str indicating token |
id: a int indicating id |
|
Raise: |
XML Exception |
|
""" |
m_cookie = response.getheader( "Set-Cookie" ) |
content = open ( "login_file.xml" ).read() |
try : |
xmldoc = parseString(content) |
except Exception, e: |
print e |
document_list = xmldoc.getElementsByTagName( 'string' ) |
token = document_list[ 4 ].childNodes[ 0 ].data |
personId = document_list[ 6 ].childNodes[ 0 ].data |
#print person information |
print '***********************************************************' |
print ' appleId: ' ,appleId |
print ' personId: ' ,personId |
print 'accountKind: ' ,document_list[ 1 ].childNodes[ 0 ].data |
print ' firstName: ' ,document_list[ 2 ].childNodes[ 0 ].data |
print ' lastName: ' ,document_list[ 3 ].childNodes[ 0 ].data |
print '************************************************************' |
return m_cookie, token, personId |
|
def get_app_information(response): |
""" get app information |
|
Args: |
response: response objects saving the data from server and other params |
Return: |
None |
|
""" |
app_json = json.loads(response.read()) |
print '************************************************************' |
print 'name version style ' |
print '------------------------------------------------------------' |
for app_item in app_json: |
name = app_item[ 'name' ] |
version = app_item[ 'versionString' ] |
style = app_item[ 'genreName' ] |
print name, '\t' , version, '\t' , style |
print '------------------------------------------------------------' |
|
def parse_json(response): |
""" parse json data |
|
parse json data from response |
Args: |
response: response objects saving the data from server and other params |
Return: |
ids: a string contains all the id of app |
Raise: |
json load Exception |
""" |
try : |
#json_data is a dict which just like:{'Apps":{'id1',n1,'id2':n2,...}} |
json_data = json.loads(response.read()) |
#app_item is app id |
ids = ',' .join(app_item for app_item in json_data[ 'Apps' ]) |
except Exception, e: |
print e |
return ids |
|
def itunes_body(): |
""" itunes logining main framework |
|
the main framework contains the following steps: |
1 login and get the cookie |
2 get the list(you need to send cookies and other params to server) |
3 get the information of the app(by the id of app) |
|
Args: |
none |
|
Returns: |
None |
|
Raise: |
some Exception |
""" |
|
isLoginSuccess, isServerRight = False , True |
appleId, passWord, response = " ", " ", None |
print time.time() |
print 'login itunes page' |
print 'please input your apple id and password:' |
#set initialise host name |
hostName = "p72-buy.itunes.apple.com" |
""" begin login """ |
while isLoginSuccess = = False : |
#linking the right server |
if isServerRight: |
appleId = raw_input ( " id:" ) |
password = raw_input ( " psw:" ) |
print 'please wait, logining ... ... ...' |
httpClient = httplib.HTTPSConnection(hostName, 443 , timeout = 60 ) |
print 'connect server ok' |
#constrct the body and headers |
body = "<?xml version='1.0' encoding='utf-8'?><plist version='1.0'><dict><key>appleId</key><string>" |
body = body + appleId + "</string><key>attempt</key><integer>1</integer><key>createsession</key><string>true</string><key>guid</key><string>e50bd206.f858d3c7.44653f9a.a031c3f4.d8d0088e.9a65dbc9.fe8350c4</string><key>machinename</key><string>KYMO-PSC</string><key>password</key><string>" |
body = body + password + "</string><key>why</key><string>signIn</string></dict></plist>" |
headers = { |
"User-Agent" : "iTunes/11.0.2 (Windows; Microsoft Windows 7 Ultimate Edition (Build 7600)) AppleWebKit/536.27.1" |
} |
response = request_server(httpClient, "/WebObjects/MZFinance.woa/wa/authenticate" , body, headers, "POST" ) |
print 'request server ok' |
isLoginSuccess, isServerRight, hostName = auth_check(response, hostName, isServerRight, isLoginSuccess) |
""" end login """ |
#begin getting user information and some params |
m_cookie, token, personId = get_user_information(response, appleId) |
#end |
""" get app list """ |
req_body = "action=POST&mt=8&vt=lockerData&restoreMode=undefined" |
head = { "User-Agent" : "iTunes/11.0.2 (Windows; Microsoft Windows 7 Ultimate Edition (Build 7600)) AppleWebKit/536.27.1" , |
"X-Token" :token, |
"Accept-Language" : "zh-cn, zh;q=0.75, en-us;q=0.50, en;q=0.25" , |
"Content-Type" : "application/x-www-form-urlencoded" , |
"Cookie" :m_cookie, |
"Host" : "se.itunes.apple.com" , |
"X-Dsid" : str (personId) |
} |
|
purchaseClient = httplib.HTTPSConnection( "se.itunes.apple.com" , 443 , timeout = 60 ) |
purchaseResponse = request_server(purchaseClient, "/WebObjects/MZStoreElements.woa/wa/purchases?cc=cn" , req_body, head, "POST" ) |
ids = parse_json(purchaseResponse) |
#if app list exists |
if ids: |
qurDict = { |
'action' : 'POST' , |
'contentIds' : ids, |
'pillId' : 0 , |
'mt' : 8 , |
'sortValue' : 4 , |
'vt' : "contentData" , |
'restoreMode' : "undefined" |
} |
qurBody = urllib.urlencode(qurDict) |
appClient = httplib.HTTPSConnection( "se.itunes.apple.com" , 443 , timeout = 60 ) |
appResponse = request_server(appClient, "/WebObjects/MZStoreElements.woa/wa/purchases?cc=cn" , qurBody, head, "POST" ) |
get_app_information(appResponse) |
|
else : |
print "you haven't buy any app !" |
|
""" end getting app list """ |
|
""" begin purchases """ |
newHead = { |
"Host" : "itunes.apple.com" , |
"User-Agent" : "iTunes/11.0.2 (Windows; Microsoft Windows 7 Ultimate Edition (Build 7600)) AppleWebKit/536.27.1" , |
"Accept" : "*/*" , |
"X-Token" : token, |
"Accept-Language" : "zh-cn, zh;q=0.75, en-us;q=0.50, en;q=0.25" , |
"Cookie" : m_cookie, |
"X-Dsid" : personId, |
} |
|
|
#get the appExtVrsId and salamedId |
cookie_support = urllib2.HTTPCookieProcessor(cookielib.CookieJar()) |
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) |
urllib2.install_opener(opener) |
opener.addheaders = [( "User-Agent" , "iTunes/11.0.2 (Windows; Microsoft Windows 7 Ultimate Edition (Build 7600)) AppleWebKit/536.27.1" )] |
try : |
res = opener. open ( "https://itunes.apple.com/cn/app/sha-shou-jiang-shi-zhi-cheng2/id533044969?mt=8" ) |
st = res.read() |
pattern = re.findall(r 'productType.*appExtVrsId=\d*' , st) |
content = pattern[ 0 ].split( '&' ) |
#dicts save the appExtVrsId,salableAdamId and so on |
dicts = dict ([(item.split( '=' )[ 0 ], item.split( '=' )[ 1 ]) for item in content]) |
except Exception,e: |
print e |
|
""" |
body = '''<?xml version="1.0" encoding="UTF-8"?> |
<plist version="1.0"> |
<dict> |
<key>appExtVrsId</key> |
<string>''' + dicts['appExtVrsId'] + '''</string> |
<key>guid</key> |
<string>E50BD206.F858D3C7.44653F9A.A031C3F4.D8D0088E.9A65DBC9.FE8350C4</string> |
<key>kbsync</key> |
<data>''' + 'kbsync' + ''' |
</data> |
<key>machineName</key> |
<string>KYMO-PC</string> |
<key>needDiv</key> |
<string>0</string> |
<key>origPage</key> |
<string>Software-CN-Electronic Arts-Yogify-580676053</string> |
<key>origPage2</key> |
<string>Genre-CN-Mobile Software Applications-29099</string> |
<key>origPageCh</key> |
<string>Software Pages</string> |
<key>origPageCh2</key> |
<string>Mobile Software Applications-main</string> |
<key>origPageLocation</key> |
<string>Buy</string> |
<key>origPageLocation2</key> |
<string>Tab_iphone1|Swoosh_1|Lockup_16</string> |
<key>price</key> |
<string>'''+dicts['price'] + '''</string> |
<key>pricingParameters</key> |
<string>''' + dicts['pricingParameters'] + '''</string> |
<key>productType</key> |
<string>''' + dicts['productType'] + '''</string> |
<key>salableAdamId</key> |
<string>''' + dicts['salableAdamId'] + '''</string> |
</dict> |
''' |
|
print body |
httpClient = httplib.HTTPSConnection(hostName, 443, timeout = 30) |
st = httpClient.request("POST", "/WebObjects/MZBuy.woa/wa/buyProduct",body,head) |
""" |
|
"""end purchase """ |
|
print 'logout ?' |
print '1 yes 2 no' |
ans = int ( raw_input ()) |
if ans = = 1 : |
httpClient = httplib.HTTPSConnection(hostName, 443 , timeout = 30 ) |
st = httpClient.request( "GET" , "/WebObjects/MZFinance.woa/wa/logoutWithSignOutKey" , " " ,headers) |
resp = httpClient.getresponse() |
print resp.read() |
print 'logout success' |
|
if __name__ = = '__main__' : |
itunes_body() |
中级程序员
by: 猴子的救兵 发表于:2017-09-13 16:10:19 顶(0) | 踩(0) 回复
Python用的什么开发工具啊?
网友回复
回复低调的小飞 : pycharm
顶(0) 踩(0) 2017-11-25 17:03:06
回复评论