2015-05-22 54 views
0

我是Python的新手,因此忍受着我... 尝试对Instagram API进行简单的oAuth调用。注册您的应用程序后,你会得到您的客户端ID,客户端密钥等,在OAuth过程的第一步是将用户定向到该授权网址:使用Python请求自定义GET响应模块

https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code 

当我在浏览器中加载这个URL与我的客户ID和重定向URL,下面的URL出现在浏览器(例如):

http://instagrram.geometryfletch.com/home.html?code=956237827314ee22092384984938 

我的问题是,我怎么能复制使用请求模块浏览器会发生什么?

,当我尝试以下方法:

>>> import requests 
>>> b = requests.get('https://api.instagram.com/oauth/authorize/?client_id=c918883453360349850498&redirect_uri=http://instagrram.myredirect.com/home.html&response_type=code') 
>>> b.text 

我得到的回复是这种“garbbled”响应(我知道这是不是真的grabbled,请在做什么,我告诉它,返回一些适当的):

u'<!DOCTYPE html>\n<!--[if lt IE 7]>  <html lang="en" class="no-js lt-ie9 lt-ie8 lt-ie7 not-logged-in "> <![endif]-->\n<!--[if IE 7]>   <html lang="en" class="no-js lt-ie9 lt-ie8 not-logged-in "> <![endif]-->\n<!--[if IE 8]>   <html lang="en" class="no-js lt-ie9 not-logged-in "> <![endif]-->\n<!--[if gt IE 8]><!--> 
<html lang="en" class="no-js not-logged-in "> <!--<![endif]-->\n 
<head>\n 
    <meta charset="utf-8"> 
    \n 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    \n\n <title>Log in &mdash; Instagram</title>\n\n 
    <script type="text/javascript">\ 
    n 
    WebFontConfig = { 
    \ 
    n 
    custom: {\n 
     families: [\'proxima-nova:n4,n7\'],\n  urls: [\'//instagramstatic-a.akamaihd.net/bluebar/660508e/cache/styles/fonts.css\']\n }\n };\n</script> 
    \n 
    <script src="//instagramstatic-a.akamaihd.net/bluebar/660508e/scripts/webfont.js" type="text/javascript" 
      async></script> 
    \n\n \n \n 
    <meta name="robots" content="noimageindex"> 
    \n \n 
    <meta name="apple-mobile-web-app-capable" content="yes"> 
    \n 
    <meta name="apple-mobile-web-app-status-bar-style" content="black"> 
    \n\n\n \n 
    <meta id="viewport" name="viewport" 
      content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1"> 
    \n\n\n 
    <script type="text/javascript">\ 
    n(function() {\n 
     var docElement = document.documentElement;\n 
     var classRE = new RegExp(\'(^|\\\\s)no-js(\\\\s|$)\');\n   var className = docElement.className;\n   docElement.className = className.replace(classRE, \'$1js$2\');\n  })();\n  </script> 
    \n\n \n\n \n \n \n 
    <link rel="Shortcut Icon" type="image/x-icon" 
      href="//instagramstatic-a.akamaihd.net/bluebar/660508e/images/ico/favicon.ico"> 
    \n \n \n 
    <link rel="apple-touch-icon-precomposed" 
      href="//instagramstatic-a.akamaihd.net/bluebar/660508e/images/ico/apple-touch-icon-precomposed.png"> 
    \n 
    <link rel="apple-touch-icon-precomposed" sizes="72x72" 
      href="//instagramstatic-a.akamaihd.net/bluebar/660508e/images/ico/apple-touch-icon-72x72-precomposed.png"> 
    \n 
    <link rel="apple-touch-icon-precomposed" sizes="114x114" 
      href="//instagramstatic-a.akamaihd.net/bluebar/660508e/images/ico/apple-touch-icon-114x114-precomposed.png"> 
    \n 
    <link rel="apple-touch-icon-precomposed" sizes="144x144" 
      href="//instagramstatic-a.akamaihd.net/bluebar/660508e/images/ico/apple-touch-icon-144x144-precomposed.png"> 
    \n \n \n 
    <link href="//instagramstatic-a.akamaihd.net/bluebar/660508e/cache/styles/distillery/dialog-main.css" 
      type="text/css" rel="stylesheet"></link> 
    \n 
    <!--[if lt IE 9]>\n <style>\n  .dialog-outer {\n   min-height: 0;\n  }\n </style>\n  
    <![endif]-->\n\n \n 
    <script src="//instagramstatic-a.akamaihd.net/bluebar/660508e/scripts/jquery.js" type="text/javascript"></script> 
    \n 
    <script src="//instagramstatic-a.akamaihd.net/bluebar/660508e/scripts/bluebar.js" type="text/javascript"></script> 
    \n 
    <script type="text/javascript">\ 
    n 
    $(document).ready(function() {\n 
     $("#id_username").focus();\n 
     setTimeout(function() {\n 
      document.getElementById(\'viewport\').setAttribute(\'content\', \'width=\'+ window.innerWidth + \', user-scalable=no\');\n  }, 5);\n });\n</script> 
    \n\n\n 
</head> 
\n 
<body class="p-dialog oauth-login">\n \n \n 
<div class="root">\n \n 
    <section class="dialog-outer">\n 
     <div class="dialog">\n 
      <header>\n <h1 class="logo">Instagram</h1>\n \n</header> 
      \n 
      <div class="dialog-main">\n \n\n\n\n\n\n\n 
       <form method="POST" id="login-form" class="adjacent" 
         action="/accounts/login/?force_classic_login=&amp;next=/oauth/authorize/?client_id=c91888345336494ab7ea7046427ca23e%26redirect_uri=http://instagrram.geometryfletch.com/home.html%26response_type=code"> 
        \n <input type="hidden" name="csrfmiddlewaretoken" .......... 

,但我怎么能得到请求返回时只是简单的code:code=956237827314ee22092384984938时加载的URL到浏览器?

+0

您在此问题中提供的任何凭据/用户信息是否更好地保密? –

+0

你为什么要这样做,而不是使用完美的[Instagram Python库](https://github.com/instagram/python-instagram)? –

+0

@ Jan-PhilipGehrcke问题中没有任何信息是我的实际凭证信息,我只是为了发布此问题而编制了这些信用。 – AdjunctProfessorFalcon

回答

1

为了生产目的,您不应该重新实施oauth。请看https://pypi.python.org/pypi/oauthlib这是一个用于执行oauth认证逻辑的已建立的库。如果你想坚持requests,那么也有https://github.com/requests/requests-oauthlib。除此之外,关于你的问题

我的问题是,我怎么能复制使用 请求模块浏览器会发生什么?

这不是微不足道的。首先,使用curl或浏览器插件来调试/重建协议流。然后第二步是使用requests重建相同的流程。

例:当通过GET访问你在你的问题中提到的第一个网址,服务器以302 redirection,其目标在响应Location场给出回应。该响应还通过Set-Cookie标题字段设置了一个cookie。所有这些都很重要。

+0

感谢您提供丰富的回复,非常感谢。需要说明的是,在请求中的浏览器中加载该URL的方式并不相同。我只能用cURL来做到这一点吗? – AdjunctProfessorFalcon

+0

浏览器在比请求更高的级别上工作。你不能告诉请求“请像Firefox一样行事”。但是,请求肯定会提供您自己实现浏览器所需的所有工具。您只需理解浏览器在后台执行的操作通常比发出HTTP GET请求和“显示”响应要复杂得多。响应通过一切手段进行评估,并根据响应的具体情况采取行动,包括所有标题字段。 –

+0

您应该安装一个可视化HTTP协议流的浏览器插件。然后访问一个简单的网站,仔细看看发生了什么。然后登录Facebook并查看发生了什么。这将是非常复杂的。正如我所说的,所有这些*都可以使用请求(或任何其他HTTP库)重新实现,但它可能需要很多工作。 –