bugfix> python > 投稿

認証をコーディングし、アクセストークンを取得していますが、それを使用してオブジェクトを取得すると、最終的に 'NoneType' object is not callable が取得されます 。

Exception Location: googleads\adwords.py in GetService, line 365
 Exception Type: Type Error
 Exception Value: Internal Server Error: /oauth2callback

Customerを呼び出してもCampaignServiceを呼び出しても、同じ結果が得られます。何が間違っているのか理解できません。

私はコードに従っていますGoogleads。

def getAdwordsFlow():
    FLOW.redirect_uri = 'http://localhost/oauth2callback'
    # Generate URL for request to Google's OAuth 2.0 server.
    authorization_url, state = FLOW.authorization_url(
        access_type='offline',
        include_granted_scopes='true')
    return authorization_url

def getAdwordsTokens(request):
    auth_code = request.GET.get('code')
    FLOW.fetch_token(code=auth_code)
    credentials = FLOW.credentials
    oauth2_client = oauth2.GoogleAccessTokenClient(
    FLOW.credentials.token, FLOW.credentials.expiry)
    adwords_client = adwords.AdWordsClient(
    "DEVELOPER-TOKEN", oauth2_client, "USER-AGENT", "CLIENT-CUSTOMER-ID")
    customer = adwords_client.GetService('CustomerService').getCustomers()[0]
    print('You are logged in as customer: %s' % customer['customerId'])
    return HttpResponseRedirect("/")

url.py

urlpatterns = [
    re_path(r'^oauth2callback', queries.getAdwordsTokens, name='auth_calledback'),] #How

view.py

def index(request):
    return redirect(getAdwordsFlow())

ターミナル出力:

"GET /oauth2callback?state=XXXXXXXXX&code=4/XXXXXXXXXXX&scope=https://www.googleapis.com/auth/adwords+https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email HTTP/1.1" 500 80213 なぜ500ですか?

アクセストークンを呼び出すと、アクセストークンの値が異なります。だから私はそれが機能していると仮定しています。

回答 1 件
  • あなたの質問によると、あなたのサービスコールは-

    GET /oauth2callback?state=XXXXXXXXX&code=4/XXXXXXXXXXX&scope=https://www.googleapis.com/auth/adwords+https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email HTTP/1.1

    この呼び出しは、アクセストークンの取得呼び出しでも、 access_token の呼び出しでもありません  リクエスト内で、参照コードごとに access_token を生成します   refresh_token から 。

    def main(access_token, token_expiry, client_customer_id, developer_token,
             user_agent):
      oauth2_client = oauth2.GoogleAccessTokenClient(access_token, token_expiry)
      adwords_client = adwords.AdWordsClient(
          developer_token, oauth2_client, user_agent,
          client_customer_id=client_customer_id)
      customer = adwords_client.GetService('CustomerService').getCustomers()[0]
      print 'You are logged in as customer: %s' % customer['customerId']
    
    if __name__ == '__main__':
      args = parser.parse_args()
      # Retrieve a new access token for use in this example. In a production
      # application, you may use a credential store to share access tokens for a
      # given user across applications.
      oauth2credentials = client.OAuth2Credentials(
          None, args.client_id, args.client_secret, args.refresh_token,
          datetime.datetime(1980, 1, 1, 12), GOOGLE_OAUTH2_ENDPOINT,
          USER_AGENT)
      oauth2credentials.refresh(httplib2.Http())
      main(oauth2credentials.access_token, oauth2credentials.token_expiry,
           args.client_customer_id, args.developer_token, USER_AGENT)
    
    

    したがって、コードを使用するには、最初に refresh_token を生成します  このコードを使用してから、指定されたコードで使用します。

あなたの答え