`
wbj0110
  • 浏览: 1610968 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

模拟新浪微博自动登陆

    博客分类:
  • php
阅读更多
PHP code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
<?php
/**
 * 功能: 模拟新浪微博登陆
 * 用途: 模拟用户登陆, 以便进行后续操作, 比如自动化的控制自己的新浪app刷新某些数据
 * 注意事项: 
 *     1. 需要安装nodejs
 *     2. 需要下载新浪的加密js文件, 请到新浪登陆页查看网络请求自己下载最新版本(我当时用的: http://js.t.sinajs.cn/t35/miniblog/static/js/sso.js?version=e482ef2bbdaa8bc2)
 *     3. 对新浪加密js文件进行修改, 以便让nodejs可以运行它
 *        1) 在文件前面增加下面内容
var    window    = {
    location    : {
        hash        : '', 
        host        : 'weibo.com', 
        hostname    : 'weibo.com', 
        href        : 'http://weibo.com/', 
        pathname    : '/', 
        port        : '', 
        protocol    : 'http:', 
        search        : ''
    }, 
    navigator    : {
        appCodeName        : 'Mozilla', 
        appName            : 'Netscape', 
        appVersion        : '5.0 (Macintosh)', 
        buildID            : '20120713134347', 
        cookieEnabled    : true, 
        doNotTrack        : 'unspecified', 
        language        : 'en-US'
    }
};
var    location    = window.location;
var    navigator    = window.navigator;
 *        2) 在文件后面增加下面内容
var    argv    = process.argv.splice(2);
 
var    pubkey        = argv[0],
    servertime    = argv[1],
    nonce        = argv[2],
    password    = argv[3];
 
var RSAKey = new sinaSSOEncoder.RSAKey();
RSAKey.setPublic(pubkey, '10001');
password = RSAKey.encrypt([servertime, nonce].join("\t") + "\n" + password); 
console.log(password);
process.exit();
 *    4. 修改encode_password函数中的nodejs程序路径和修改后的新浪js文件路径
 *     5. 修改用户名密码
 * author: selfimpr
 * blog: http://blog.csdn.net/lgg201
 * mail: lgg860911@yahoo.com.cn
 */
 
define('REQUEST_METHOD_GET',                'GET');
define('REQUEST_METHOD_POST',                'POST');
define('REQUEST_METHOD_HEAD',                'HEAD');
 
define('COOKIE_FILE',                        '/tmp/sina.login.cookie');
 
function curl_switch_method($curl$method) {
    switch $method) {
        case REQUEST_METHOD_POST:
            curl_setopt($curl, CURLOPT_POST, TRUE);
            break;
        case REQUEST_METHOD_HEAD:
            curl_setopt($curl, CURLOPT_NOBODY, TRUE);
            break;
        case REQUEST_METHOD_GET:
        default:
            curl_setopt($curl, CURLOPT_HTTPGET, TRUE);
            break;
    }
}
function curl_set_headers($curl$headers) {
    if empty($headers) ) return ;
    if is_string($headers) ) 
        $headers    explode("\r\n"$headers);
    #类型修复
    foreach $headers as &$header 
        if is_array($header) ) 
            $header    = sprintf('%s: %s'$header[0], $header[1]);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
function curl_set_datas($curl$datas) {
    if empty($datas) ) return ;
    curl_setopt($curl, CURLOPT_POSTFIELDS, $datas);
}
function curl_request($url$method = REQUEST_METHOD_GET, $datas = NULL, $headers = NULL) {
    static    $curl;
    if ( !$curl )
        $curl    = curl_init();
    curl_switch_method($curl$method);
    curl_setopt($curl, CURLOPT_URL,                        $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,            TRUE);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION,            TRUE);
    curl_setopt($curl, CURLOPT_AUTOREFERER,                TRUE);
    curl_setopt($curl, CURLOPT_COOKIEJAR,                COOKIE_FILE);
    curl_setopt($curl, CURLOPT_COOKIESESSION,            TRUE);
    if $datas 
        curl_set_datas($curl$datas);
    if $headers
        curl_set_headers($curl$headers);
    $response    = curl_exec($curl);
    if $errno = curl_errno($curl) ) {
        error_log(sprintf("%10d\t%s\n"$errno, curl_error($curl)), 3, 'php://stderr');
        return FALSE;
    }
    return $response;
}
 
function get_js_timestamp() {
    return time() * 1000 + rand(0, 999);
}
function http_build_query_no_encode($datas) {
    $r    array();
    foreach $datas as $k => $v 
        $r[]    = $k '=' $v;
    return implode('&'$r);
}
 
function makeUrl($url$info$encode = TRUE) {
    if ( !is_array($info) || empty($info) ) return $url;
    $components    parse_url($url);
    if array_key_exists('query'$components) ) 
        $query    parse_str($components['query']);
    else 
        $query    array();
    if is_string($info) ) $info parse_str($info);
    $query        array_merge($query$info);
    $query        $encode
                ? http_build_query($query)
                : http_build_query_no_encode($query);
    $components['scheme']    = array_key_exists('scheme'$components)
                            $components['scheme'] . '://'
                            '';
    $components['user']        = array_key_exists('user'$components)
                            $components['user'] . ':' $components[HTTP_URL_PASS] . '@'
                            '';
    $components['host']        = array_key_exists('host'$components)
                            $components['host']
                            '';
    $components['port']        = array_key_exists('port'$components)
                            ':' $components['port']
                            '';
    $components['path']        = array_key_exists('path'$components)
                            '/' . ltrim($components['path'], '/')
                            '';
    $components['query']    = $query 
                            '?' $query
                            '';
    $components['fragment']    = array_key_exists('fragment'$components)
                            '#' $components['fragment']
                            '';
    return sprintf('%s%s%s%s%s%s%s'$components['scheme'], $components['user'], $components['host'], 
                                $components['port'], $components['path'], 
                                $components['query'], $components['fragment']);
}
 
function encode_username($username) {
    return base64_encode(urlencode($username));
}
function encode_password($pub_key$password$servertime$nonce) {
    #这里是要用nodejs执行新浪的js文件
    $response    = `/usr/local/node.js-0.8.8/bin/node sina.js "$pub_key" "$servertime" "$nonce" "$password"`;
    return substr($response, 0, strlen($response) - 1);
}
 
 
function main_page() {
    return curl_request('weibo.com');
}
function prepare_login_info() {
    $time    = get_js_timestamp();
    $url    = makeUrl('http://login.sina.com.cn/sso/prelogin.php'array(
        'entry'        => 'sso'
        'callback'    => 'sinaSSOController.preloginCallBack'
        'su'        => encode_username('undefined'), 
        'rsakt'        => 'mod'
        'client'    => 'ssologin.js(v1.4.2)'
        '_'            => $time
    ), FALSE);
    $response    = curl_request($url);
    $length        strlen($response);
    $left        = 0;
    $right        $length - 1;
    while $left $length 
        if $response[$left] == '{' break;
        else $left ++;
    while $right > 0 )
        if $response[$right] == '}' break;
        else $right --;
    $response    substr($response$left$right $left + 1);
    return array_merge(json_decode($response, TRUE), array(
        'preloginTime'    => max(get_js_timestamp() - $time, 100), 
    ));
}
 
function login($info$username$password) {
    $feedbackurl    = makeUrl('http://weibo.com/ajaxlogin.php'array(
        'framelogin'        => 1, 
        'callback'            => 'parent.sinaSSOController.feedBackUrlCallBack'
    ));
    $datas    array(
        'encoding'            => 'UTF-8'
        'entry'                => 'weibo'
        'from'                => ''
        'gateway'            => 1, 
        'nonce'                => $info['nonce'], 
        'prelt'                => $info['preloginTime'], 
        'pwencode'            => 'rsa2'
        'returntype'        => 'META'
        'rsakv'                => $info['rsakv'], 
        'savestate'            => 7, 
        'servertime'        => $info['servertime'], 
        'service'            => 'miniblog'
        'sp'                => encode_password($info['pubkey'], $password$info['servertime'], $info['nonce']), 
        'ssosimplelogin'    => 1, 
        'su'                => encode_username($username), 
        'url'                => $feedbackurl
        'useticket'            => 1, 
        'vsnf'                => 1, 
    );
    $url    = makeUrl('http://login.sina.com.cn/sso/login.php'array(
        'client'    => 'ssologin.js(v1.4.2)'
    ), FALSE);
    $response    = curl_request($url, REQUEST_METHOD_POST, $datas);
    $sign        'location.replace(\'';
    $response    substr($responsestrpos($response$sign) + strlen($sign));
    $location    substr($response, 0, strpos($response'\''));
    $response    = curl_request($location);
    $length        strlen($response);
    $left        = 0;
    $right        $length - 1;
    while $left $length 
        if $response[$left] == '{' break;
        else $left ++;
    while $right > 0 )
        if $response[$right] == '}' break;
        else $right --;
    $response    substr($response$left$right $left + 1);
    return json_decode($response, true);
}
 
$info    = prepare_login_info();
$info    = login($info'用户名''密码');
echo curl_request('http://weibo.com/u/' $info['userinfo']['uniqueid'] . $info['userinfo']['userdomain']);
分享到:
评论

相关推荐

    实现新浪微博自动登录授权

    模拟新浪微博桌面客户端应用自动授权功能,为写应用打开第一步锁。自动获取CODE并授权于应用。

    模拟登陆新浪微博

    在IT行业中,模拟登录是一种常见的技术,特别是在网络爬虫或者自动化测试中,它允许程序以用户的视角访问网站并执行特定操作。...通过这种方式,你可以编写自动化脚本,实现自动登录和浏览等功能。

    Java模拟登录新浪微博

    在本文中,我们将深入探讨如何使用Java来模拟登录新浪微博这一话题。模拟登录是网络爬虫或自动化测试中常见的技术,它允许程序以用户的身份与网站交互。对于Java开发者来说,理解这一过程对于构建自动化工具或者数据...

    安卓 模拟新浪微博随便看看程序

    综上所述,开发一个模拟新浪微博“随便看看”的安卓程序,需要掌握Android应用的基础架构、网络通信、UI设计、数据缓存、权限管理、登录授权以及测试调试等多个方面的技能。这个项目是学习和提升安卓开发能力的好...

    软件测试 新浪微博测试

    测试的方法是使用QTP工具对新浪微博进行自动化测试,模拟用户的操作,记录用户的行为,并将其转换为测试脚本。 四、测试过程 测试过程可以分为启动QTP、配置录制项、输入登录数据、写微博测试和发送微博五个步骤。...

    python3.7 requests模拟新浪微博登录

    以上就是使用Python 3.7的`requests`库模拟新浪微博登录的概述和实现过程。实际应用中,你还需要处理更多的细节,比如错误处理、验证码的处理(如果有的话)以及网络异常等。确保始终遵循最佳实践,以保证代码的安全...

    java模拟登陆新浪微博(非API)

    在本文中,我们将深入探讨如何使用Java来模拟登录新浪微博,特别是在其改版后增加了复杂性的背景下。我们将不依赖新浪提供的官方API,而是通过模拟浏览器的行为,实现自动化登录和交互。 首先,我们需要理解模拟...

    新浪微博2模拟登陆

    今天我们将聚焦于“新浪微博2模拟登陆”这一主题,学习如何通过编程方式模拟登录并获取AccessToken,以便进行自动化操作或者数据分析。 首先,我们需要了解什么是模拟登陆。模拟登陆是指通过编程代码来模拟用户在...

    selenium模拟登录新浪微博.

    本教程将详细讲解如何利用 Selenium 模拟登录新浪微博,包括必要的环境配置、关键代码实现以及可能遇到的问题。 首先,我们需要准备的工具有:Python 编程语言、Selenium 库、WebDriver(火狐驱动或 PhantomJS 驱动...

    Android WebView 新浪微博自动登陆

    总之,实现Android WebView的新浪微博自动登录涉及WebView的初始化、JavaScript注入、Cookie管理以及登录状态的持久化。这个过程需要对Android开发、网络请求、以及可能的安全问题有深入理解。通过以上步骤,你可以...

    Sahi新浪微博自动化测试实例

    在“新浪微博自动化测试”这个案例中,你可能需要编写脚本来模拟以下操作: 1. 打开微博首页 2. 登录微博账号 3. 检查登录状态 4. 浏览个人主页 5. 发布一条新的微博 6. 查看发布的微博是否显示正确 7. 退出登录 ...

    新浪微博爬虫,用python爬取新浪微博数据,并下载微博图片和微博视频.zip

    在本资源中,我们主要探讨的是如何利用Python编程语言实现一个针对新浪微博的网络爬虫,目的是抓取微博数据,包括微博的文字内容、图片以及视频。爬虫是数据挖掘的重要工具,它能自动化地从互联网上收集信息,对于...

    新浪微博python爬虫程序

    程序通过模拟用户在新浪微博平台的浏览行为,自动模拟登录并访问目标用户的主页或特定微博页面,然后抓取所需的信息。 使用这个爬虫程序,你可以轻松地获取新浪微博上的用户数据、微博内容,进行社交网络分析、舆情...

    新浪微博模拟登陆

    在信息技术领域,模拟登录是一种常见的技术手段,它允许开发者通过编程方式自动登录网站并执行一些操作,例如抓取数据。本主题聚焦于使用Java实现对新浪微博的模拟登录,这对于数据分析、信息抓取或自动化测试等应用...

    Java模拟新浪和腾迅自动登录并发送微博(2013年3月更新可用)

    Java模拟新浪和腾迅自动登录并发送微博(2013年3月更新可用)

    腾讯新浪微博模拟登录最新源码(java版)

    这个“腾讯新浪微博模拟登录最新源码(java版)”提供了一种使用Java编程语言实现这一功能的方法。下面将详细介绍这个源码可能涉及的关键知识点。 1. **HTTP协议与网络请求**:模拟登录首先需要理解HTTP协议,包括...

    Python-爬取新浪微博信息

    **Python-爬取新浪微博信息** 在信息技术领域,网络爬虫是一种自动提取网页数据的程序,它们可以帮助我们收集、分析大量的互联网信息。在这个项目中,我们将专注于使用Python来爬取新浪微博的数据,尤其是账户下的...

    需要登录才能抓取的新浪微博爬虫例子

    然而,许多网站为了保护用户隐私和防止恶意爬取,会设置登录验证机制,新浪微博就是其中之一。本篇将详细介绍一个解决“需要登录才能抓取的新浪微博爬虫例子”,帮助你理解和构建类似的爬虫程序。 首先,我们需要...

    新浪微博登录 上传图片python脚本

    一个模拟浏览器的新浪微博客户端,采用python实现,现在可以上传图片,希望对那些想做脚本自动发微博的朋友有所帮助。

    新浪微博晒号软件(桌面提取器5.0)

    虽然具体的实现方式未在描述中详述,但我们可以推测,这款软件可能采用了模拟登录、自动化脚本和数据抓取等技术。它可能利用了微博API接口,遵循一定的协议规则,安全地与服务器进行交互,获取并存储账号数据。同时...

Global site tag (gtag.js) - Google Analytics