0

アクセスしようとしている API によって認証されようとしています。URL に入るパラメーターをエンコードするために urllib.parse.urlencode を使用しています。urllib.request.urlopen を使用してコンテンツを取得しています。

これにより、サーバーから次のような 3 つの値が返されます。

SID=AAAAAAAAAAA
LSID=BBBBBBBBBBB
AUTH=CCCCCCCCCCC

問題は、最初の値と末尾の改行文字のみを返すことです。

import urllib.request
import urllib.parse

Emailparamx = 'Email'
Emailparam = Emailparamx.encode('utf-8')
email = 'myemail@stackoverflow.com'
email = email.encode('utf-8')
Passwdparam = 'Passwd'
Passwdparam = Passwdparam.encode('utf-8')
password = 'hidden'
password = password.encode('utf-8')
Accounttypeparam = 'accountType'
Accounttypeparam = Accounttypeparam.encode('utf-8')
accounttype = 'GOOGLE'
accounttype = accounttype.encode('utf-8')
Serviceparam = 'service'
Serviceparam = Serviceparam.encode('utf-8')
service = 'adwords'
service = service.encode('utf-8')


url = 'https://accounts.google.com/ClientLogin?'
urlen = url.encode('utf-8')
data = [(Emailparamx, email), (Passwdparam, password),
        (Accounttypeparam, accounttype), (Serviceparam, service)]



auth = ''

dataurl = urllib.parse.urlencode(data)


accessurl = (url + "%s" % dataurl)

fh = urllib.request.urlopen(accessurl)

equals = '='
eqenc = equals.encode('utf-8')

try:
  msg = fh.readline().split(eqenc)
  print (msg)

そして、msgが印刷されます

[b'SID', b'AAAAAAAAAAAAAAAAA\n']

私はそれが非常に醜いコードであることを知っています。私はPythonで約1週間です。どんな助けでも大歓迎です。

4

1 に答える 1

0

問題は、一度しか呼び出してreadlineいないため、1 行しか読み取らないことです。行を 1 つずつ読みたい場合は、readline完了するまでループで呼び出し続ける必要があります。

while True:
    msg = fh.readline()
    if not msg:
        break
    msg = msg.split(eqenc)
    print(msg)

readlineただし、ファイルのようなオブジェクト (オブジェクトを含むurlopen) は既に行でいっぱいの反復可能なオブジェクトであるため、ここで呼び出す正当な理由はありません。

for msg in fh:
    print(msg)

一方、元のコードにはまたは のtryないaがあり、単に a を発生させます。おそらく、次のようなものが必要でした:exceptfinallySyntaxError

try:
    for msg in fh:
        print(msg)
except Exception as e:
    print('Exception: {}'.format(e))

その過程で、コードを少し単純化できます。

を見ると:

GETメソッドを使用してパラメーターを含む URL を取得するセッションの例を次に示します。

それがまさにあなたがここでやりたいことです (最後の行を除いて)。文字列をエンコードするために行っているすべての余分なことは、不必要であるだけでなく、正しくありません。UTF-8 は間違ったエンコーディングです URL に使用するエンコーディングは間違っています (すべての文字列が純粋な ASCII であるため、問題はありません)。urlopenエンコードされたバイト文字列ではなく文字列が必要です (ただし、少なくとも CPython 3.0-3.3 では、適切にエンコードされたバイト文字列を指定するとたまたま機能します)。urlencodeバイト文字列を取ることができますが、正しいことをしない可能性があります (物事を適切に引用できるように、元の Unicode を指定する必要があります)。等

fh.getheader('Content-Type')また、おそらく結果 (ASCII として送信されます。より複雑な例については、 を解析するか、API のドキュメントを読む必要があります)をデコードし、改行を取り除きたいと思うでしょう。

単に出力するのではなく、コードで使用できる構造を構築することもできます。たとえば、結果を に保存し、後のリクエストでlogin_infoが必要な場合は、.SIDlogin_info['SID']

それでは、関数でまとめて、その関数を呼び出しましょう。

import urllib.request
import urllib.parse

def client_login(email, passwd, account_type, service):
    params = {'Email': email,
              'Passwd': passwd,
              'accountType': account_type,
              'service': service}
    qs = urllib.parse.urlencode(params)
    url = 'https://accounts.google.com/ClientLogin?'
    with urllib.request.urlopen(url + qs) as fh:
        return dict(line.strip().decode('ascii').split('=', 1) for line in fh)

email = 'myemail@stackoverflow.com'
password = 'hidden'
accounttype = 'GOOGLE'
service = 'adwords'
try:
    results = client_login(email, password, accounttype, service)
    for key, value in results.items():
        print('key "{}" is "{}".format(key, value))
except Exception as e:
    print('Exception: {}'.format(e))
于 2013-06-18T01:11:19.507 に答える