网站调用新浪微博内容

网站调用新浪微博内容

网站调用新浪微博内容(试试用python调用微博API的方法微博接口 )

网站优化优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2021-09-05 07:14 • 来自相关话题

  网站调用新浪微博内容(试试用python调用微博API的方法微博接口
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写这个地址可以代替,我试了一下,果然成功,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  
import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
ppre class="brush:py;"
api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=REDIRECT_URL)
authorize_url = api.get_authorize_url()
print(authorize_url)
webbrowser.open_new(authorize_url)
/pre/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281542525.gif?2014628154319' alt=''//p
p登录后会转成一个连接/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
ppre class="brush:py;"
request = api.request_access_token(code, REDIRECT_URL)
access_token = request.access_token
expires_in = request.expires_in
api.set_access_token(access_token, expires_in)
api.statuses.update.post(status=u'Test OAuth 2.0 Send a Weibo!')/pre/p
paccess_token是获取到的token,expires_in是授权过期时间(UNIX时间)/p
p使用 set_access_token 保存授权。然后就可以调用微博界面了。测试发了一条微博/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281544056.gif?2014628154419' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
ppre class="brush:py;"
accessWeibo
# -*- coding: utf-8 -*-
#/usr/bin/env python
#access to SinaWeibo By sinaweibopy
#实现微博自动登录,token自动生成,保存及更新
#适合于后端服务调用
from weibo import APIClient
import pymongo
import sys, os, urllib, urllib2
from http_helper import *
from retry import *
try:
import json
except ImportError:
import simplejson as json
# setting sys encoding to utf-8
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
# weibo api访问配置
APP_KEY = '' # app key
APP_SECRET = '' # app secret
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致
USERID = '' # 登陆的微博用户名,必须是OAuth2.0 设置的测试账号
USERPASSWD = '' # 用户密码
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)
def make_access_token():
#请求access token
params = urllib.urlencode({
'action':'submit',
'withOfficalFlag':'0',
'ticket':'',
'isLoginSina':'',
'response_type':'code',
'regCallback':'',
'redirect_uri':REDIRECT_URL,
'client_id':APP_KEY,
'state':'',
'from':'',
'userId':USERID,
'passwd':USERPASSWD,
})
login_url = 'https://api.weibo.com/oauth2/authorize'
url = client.get_authorize_url()
content = urllib2.urlopen(url)
if content:
headers = { 'Referer' : url }
request = urllib2.Request(login_url, params, headers)
opener = get_opener(False)
urllib2.install_opener(opener)
try:
f = opener.open(request)
return_redirect_uri = f.url
except urllib2.HTTPError, e:
return_redirect_uri = e.geturl()
# 取到返回的code
code = return_redirect_uri.split('=')[1]
#得到token
token = client.request_access_token(code,REDIRECT_URL)
save_access_token(token)
def save_access_token(token):
#将access token保存到MongoDB数据库
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
t={
"access_token":token['access_token'],
"expires_in":str(token['expires_in']),
"date":time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
}
db.token.insert(t,safe=True)
#Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()
@retry(1)
def apply_access_token():
#从MongoDB读取及设置access token
try:
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
if db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]
try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False
return True
if __name__ == "__main__":
apply_access_token()
# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
retry.py
import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.
delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
http_helper.py
# -*- coding: utf-8 -*-
#/usr/bin/env python
import urllib2,cookielib
class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def http_error_302(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_302(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def get_cookie():
cookies = cookielib.CookieJar()
return urllib2.HTTPCookieProcessor(cookies)
def get_opener(proxy=False):
rv=urllib2.build_opener(get_cookie(), SmartRedirectHandler())
rv.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)')]
return rv 查看全部

  网站调用新浪微博内容(试试用python调用微博API的方法微博接口
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写这个地址可以代替,我试了一下,果然成功,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  
import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
ppre class="brush:py;"
api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=REDIRECT_URL)
authorize_url = api.get_authorize_url()
print(authorize_url)
webbrowser.open_new(authorize_url)
/pre/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281542525.gif?2014628154319' alt=''//p
p登录后会转成一个连接/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
ppre class="brush:py;"
request = api.request_access_token(code, REDIRECT_URL)
access_token = request.access_token
expires_in = request.expires_in
api.set_access_token(access_token, expires_in)
api.statuses.update.post(status=u'Test OAuth 2.0 Send a Weibo!')/pre/p
paccess_token是获取到的token,expires_in是授权过期时间(UNIX时间)/p
p使用 set_access_token 保存授权。然后就可以调用微博界面了。测试发了一条微博/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281544056.gif?2014628154419' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
ppre class="brush:py;"
accessWeibo
# -*- coding: utf-8 -*-
#/usr/bin/env python
#access to SinaWeibo By sinaweibopy
#实现微博自动登录,token自动生成,保存及更新
#适合于后端服务调用
from weibo import APIClient
import pymongo
import sys, os, urllib, urllib2
from http_helper import *
from retry import *
try:
import json
except ImportError:
import simplejson as json
# setting sys encoding to utf-8
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
# weibo api访问配置
APP_KEY = '' # app key
APP_SECRET = '' # app secret
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致
USERID = '' # 登陆的微博用户名,必须是OAuth2.0 设置的测试账号
USERPASSWD = '' # 用户密码
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)
def make_access_token():
#请求access token
params = urllib.urlencode({
'action':'submit',
'withOfficalFlag':'0',
'ticket':'',
'isLoginSina':'',
'response_type':'code',
'regCallback':'',
'redirect_uri':REDIRECT_URL,
'client_id':APP_KEY,
'state':'',
'from':'',
'userId':USERID,
'passwd':USERPASSWD,
})
login_url = 'https://api.weibo.com/oauth2/authorize'
url = client.get_authorize_url()
content = urllib2.urlopen(url)
if content:
headers = { 'Referer' : url }
request = urllib2.Request(login_url, params, headers)
opener = get_opener(False)
urllib2.install_opener(opener)
try:
f = opener.open(request)
return_redirect_uri = f.url
except urllib2.HTTPError, e:
return_redirect_uri = e.geturl()
# 取到返回的code
code = return_redirect_uri.split('=')[1]
#得到token
token = client.request_access_token(code,REDIRECT_URL)
save_access_token(token)
def save_access_token(token):
#将access token保存到MongoDB数据库
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
t={
"access_token":token['access_token'],
"expires_in":str(token['expires_in']),
"date":time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
}
db.token.insert(t,safe=True)
#Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()
@retry(1)
def apply_access_token():
#从MongoDB读取及设置access token
try:
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
if db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]
try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False
return True
if __name__ == "__main__":
apply_access_token()
# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
retry.py
import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.
delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
http_helper.py
# -*- coding: utf-8 -*-
#/usr/bin/env python
import urllib2,cookielib
class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def http_error_302(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_302(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def get_cookie():
cookies = cookielib.CookieJar()
return urllib2.HTTPCookieProcessor(cookies)
def get_opener(proxy=False):
rv=urllib2.build_opener(get_cookie(), SmartRedirectHandler())
rv.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)')]
return rv

网站调用新浪微博内容(wordpress网站可以写php代码1.php文件测试.php)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-09-05 07:11 • 来自相关话题

  网站调用新浪微博内容(wordpress网站可以写php代码1.php文件测试.php)
  据说wordpress网站发帖时可以将文章同步到新浪微博,我想根据同样的方法写一个php代码测试。以下引用自:
  微博同步有插件、关联博客、非插件微博界面三种方式
  第一种是直接在百度上搜索;
  其次,由于新浪取消了链接博客的选项,但该功能并没有取消,您可以询问以下地址并进行配置。
  第三种方法需要使用新浪的界面,如下:
  1) 前往新浪微博开放平台创建现场应用。您可以通过或不通过审核,但如果通过,您可以在微博底部显示来自XX的应用程序,例如来自KingGoo技术博客图片。如何创建你你可以在百度和谷歌上搜索。很简单(但是如果你没有通过review想通过review,我可以提供有偿帮助~)。创建应用后,需要使用App Key申请下方的应用;
  2)编辑你主题的functions.php文件并在最后添加以下代码
  // 微博同步function post_to_sina_weibo($post_ID) { if( wp_is_post_revision($post_ID) ) return; $get_post_info = get_post($post_ID); $get_post_centent = get_post($post_ID)->post_content; //去掉文章内的html编码的空格、换行、tab等符号(如果你文章的编码格式是这样子,可以将下面的"//"去掉即开启此功能) //$get_post_centent = str_replace("\t", " ", str_replace("\n", " ", str_replace(" ", " ", $get_post_centent))); $get_post_title = get_post($post_ID)->post_title; if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] != 'publish' ) { $request = new WP_Http; $status = '【' . strip_tags( $get_post_title ) . '】 ' . mb_strimwidth(strip_tags( apply_filters('the_content', $get_post_centent)),0, 132,'...') . ' 全文地址:' . get_permalink($post_ID) ; $api_url = 'https://api.weibo.com/2/statuses/update.json'; $body = array( 'status' => $status, 'source'=>'4135063399'); $headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); /* 如果你使用改方法,请注释掉上面$headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); 换成如下代码 //你的新浪微博登陆名 $username = '' ; //你的新浪微博登陆密码 $password = '' ; $headers = array( 'Authorization' => 'Basic ' . base64_encode('$username:$password')); */ $result = $request->post( $api_url , array( 'body' => $body, 'headers' => $headers ) ); }}add_action('publish_post', 'post_to_sina_weibo', 0);
  文章中需要用到wordpress自带的WP_Http类,我在github上找到了替代品:
  关于这个类的一个说明:EasyHttp是一个帮助你忽略不同php环境条件,乱发送http请求的php类。您不再需要关注当前的 php 环境是否支持 curl/fsockopen/fopen,EasyHttp 会自动选择最合适的方式进行 http 请求。 EasyHttp 派生自 WordPress 中的 WP_Http 类,它去除了对其他 WordPress 功能的所有依赖,将其拆分为不同的文件,并进行了少量简化。
  根据以上内容编写php代码1.php:
  浏览器访问1.php时返回如下内容:
  Array ([headers] => Array ([server] => nginx/1.2.0 [date] => Sun, 13 Oct 2013 02:23:46 GMT [content-type] => text /plain;charset=UTF-8 [content-length] => 76 [connection] => close [api-server-ip] => 10.75.0.170 [vary] => Accept-编码 [x-varnish] => 3299864740 [age] => 0 [via] => 1.1 varnish) [body] => Bad Content-Type header value:'application/x-www-form-urlencoded; charset ='[response] => Array ([code] => 400 [message] => Bad Request) [cookies] => Array () [filename] => )
  似乎是 400 Bad Request。百度点击了。意思是“由于语法格式错误,服务器无法理解此请求。不修改,客户端程序无法重复此请求。”
  你是如何解决这个问题的? 查看全部

  网站调用新浪微博内容(wordpress网站可以写php代码1.php文件测试.php)
  据说wordpress网站发帖时可以将文章同步到新浪微博,我想根据同样的方法写一个php代码测试。以下引用自:
  微博同步有插件、关联博客、非插件微博界面三种方式
  第一种是直接在百度上搜索;
  其次,由于新浪取消了链接博客的选项,但该功能并没有取消,您可以询问以下地址并进行配置。
  第三种方法需要使用新浪的界面,如下:
  1) 前往新浪微博开放平台创建现场应用。您可以通过或不通过审核,但如果通过,您可以在微博底部显示来自XX的应用程序,例如来自KingGoo技术博客图片。如何创建你你可以在百度和谷歌上搜索。很简单(但是如果你没有通过review想通过review,我可以提供有偿帮助~)。创建应用后,需要使用App Key申请下方的应用;
  2)编辑你主题的functions.php文件并在最后添加以下代码
  // 微博同步function post_to_sina_weibo($post_ID) { if( wp_is_post_revision($post_ID) ) return; $get_post_info = get_post($post_ID); $get_post_centent = get_post($post_ID)->post_content; //去掉文章内的html编码的空格、换行、tab等符号(如果你文章的编码格式是这样子,可以将下面的"//"去掉即开启此功能) //$get_post_centent = str_replace("\t", " ", str_replace("\n", " ", str_replace(" ", " ", $get_post_centent))); $get_post_title = get_post($post_ID)->post_title; if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] != 'publish' ) { $request = new WP_Http; $status = '【' . strip_tags( $get_post_title ) . '】 ' . mb_strimwidth(strip_tags( apply_filters('the_content', $get_post_centent)),0, 132,'...') . ' 全文地址:' . get_permalink($post_ID) ; $api_url = 'https://api.weibo.com/2/statuses/update.json'; $body = array( 'status' => $status, 'source'=>'4135063399'); $headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); /* 如果你使用改方法,请注释掉上面$headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); 换成如下代码 //你的新浪微博登陆名 $username = '' ; //你的新浪微博登陆密码 $password = '' ; $headers = array( 'Authorization' => 'Basic ' . base64_encode('$username:$password')); */ $result = $request->post( $api_url , array( 'body' => $body, 'headers' => $headers ) ); }}add_action('publish_post', 'post_to_sina_weibo', 0);
  文章中需要用到wordpress自带的WP_Http类,我在github上找到了替代品:
  关于这个类的一个说明:EasyHttp是一个帮助你忽略不同php环境条件,乱发送http请求的php类。您不再需要关注当前的 php 环境是否支持 curl/fsockopen/fopen,EasyHttp 会自动选择最合适的方式进行 http 请求。 EasyHttp 派生自 WordPress 中的 WP_Http 类,它去除了对其他 WordPress 功能的所有依赖,将其拆分为不同的文件,并进行了少量简化。
  根据以上内容编写php代码1.php:
  浏览器访问1.php时返回如下内容:
  Array ([headers] => Array ([server] => nginx/1.2.0 [date] => Sun, 13 Oct 2013 02:23:46 GMT [content-type] => text /plain;charset=UTF-8 [content-length] => 76 [connection] => close [api-server-ip] => 10.75.0.170 [vary] => Accept-编码 [x-varnish] => 3299864740 [age] => 0 [via] => 1.1 varnish) [body] => Bad Content-Type header value:'application/x-www-form-urlencoded; charset ='[response] => Array ([code] => 400 [message] => Bad Request) [cookies] => Array () [filename] => )
  似乎是 400 Bad Request。百度点击了。意思是“由于语法格式错误,服务器无法理解此请求。不修改,客户端程序无法重复此请求。”
  你是如何解决这个问题的?

网站调用新浪微博内容(AXMLPrinter2.jar反编译新浪微博的开放程度,居然比新浪还要封闭)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-09-04 20:03 • 来自相关话题

  网站调用新浪微博内容(AXMLPrinter2.jar反编译新浪微博的开放程度,居然比新浪还要封闭)
  首先,我们需要使用AXMLPrinter2.jar反编译新浪微博的AndroidManifest.xml,找到显示用户信息的页面。反编译后的代码如下:
  java -jar AXMLPrinter2.jar AndroidManifest.xml > a.xml
  打开反编译出来的a.xml,搜索userinfo,幸运的找到UserInfoActivity,如下图:
  UserInfoActivity注册了两个intent-filters,第一个注册的url是sinaweibo://userinfo?uid=3444956000。有了这些信息,通过如下代码调用新浪微博客户端显示用户信息:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("sinaweibo://userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  但是以上代码的前提是用户已经安装了新浪微博客户端,否则运行时会报错。好在还有第二个,我们可以用下面的代码来调用:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("http://weibo.cn/qr/userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  以上代码的效果是:
  如果用户没有安装新浪微博,他会直接调用浏览器打开那个地址;如果用户已安装新浪微博,则会弹出如下对话框供用户选择:
  
  我再次鄙视新浪微博的开放程度,即使这个功能没有开放。
  本来打算用同样的方法在腾讯微信上做同样的功能,结果发现腾讯把显示微信账号的activity设置为私有android:exported="false",比新浪更封闭。无语了。 ! 查看全部

  网站调用新浪微博内容(AXMLPrinter2.jar反编译新浪微博的开放程度,居然比新浪还要封闭)
  首先,我们需要使用AXMLPrinter2.jar反编译新浪微博的AndroidManifest.xml,找到显示用户信息的页面。反编译后的代码如下:
  java -jar AXMLPrinter2.jar AndroidManifest.xml > a.xml
  打开反编译出来的a.xml,搜索userinfo,幸运的找到UserInfoActivity,如下图:
  UserInfoActivity注册了两个intent-filters,第一个注册的url是sinaweibo://userinfo?uid=3444956000。有了这些信息,通过如下代码调用新浪微博客户端显示用户信息:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("sinaweibo://userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  但是以上代码的前提是用户已经安装了新浪微博客户端,否则运行时会报错。好在还有第二个,我们可以用下面的代码来调用:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("http://weibo.cn/qr/userinfo?uid=3444956000";);
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  以上代码的效果是:
  如果用户没有安装新浪微博,他会直接调用浏览器打开那个地址;如果用户已安装新浪微博,则会弹出如下对话框供用户选择:
  
  我再次鄙视新浪微博的开放程度,即使这个功能没有开放。
  本来打算用同样的方法在腾讯微信上做同样的功能,结果发现腾讯把显示微信账号的activity设置为私有android:exported="false",比新浪更封闭。无语了。 !

网站调用新浪微博内容(新浪微博的用户接口和话题接口实现了(组图))

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-09-03 12:06 • 来自相关话题

  网站调用新浪微博内容(新浪微博的用户接口和话题接口实现了(组图))
  以标题为标题,调用新浪微博的用户界面和话题界面,实现对新浪微博用户和关键词相关内容的搜索:
  
  选择搜索昵称:
  
  返回搜索昵称结果:
  
  选择搜索微博内容:
  
  返回微博搜索结果:
  
  但内容超过屏幕长度,滚动条会显示剩余内容:
  
  使用的插件有:kendoUI.js 操作UI,给界面切换添加特效幻灯片。 jscex.js 练习异步加载数据,绑定搜索id和搜索微博按钮两个响应功能。还是用jQuery的ajax调用新浪微博加载对应的api数据。
  本练习中遇到的问题并不平均。一开始是不熟悉kendoUI造成的。在kendoUI中,所有页面内容都放在同一个页面上,但是data-role="view"是用来区分各个页面的。默认情况下,首页显示第一个收录属性data-role="view" div;
  接下来是api调用的跨域问题。本来打算用jsonp数据格式来解决这个问题,但是据说jscex可以解决这个问题。看了后面,发现jecex.js好像也是jsonp格式的。
  看了jscex的样例,感觉好强大。但这一次只是简单地使用它定义的异步方法,$await()、$start() 来使用异步方法。以下是点击搜索昵称按钮的一系列操作的代码:
  
  其实还有一个没有解决的问题:在遍历返回的数据时,如果去掉if(index)判断语句,结果总是返回一个“undefined”。经过调试,发现underfined对应的索引其实是code,是正确的。结果对应的索引是数据。实在是没有办法,只能用这个判断了。希望以后能找到原因。 查看全部

  网站调用新浪微博内容(新浪微博的用户接口和话题接口实现了(组图))
  以标题为标题,调用新浪微博的用户界面和话题界面,实现对新浪微博用户和关键词相关内容的搜索:
  
  选择搜索昵称:
  
  返回搜索昵称结果:
  
  选择搜索微博内容:
  
  返回微博搜索结果:
  
  但内容超过屏幕长度,滚动条会显示剩余内容:
  
  使用的插件有:kendoUI.js 操作UI,给界面切换添加特效幻灯片。 jscex.js 练习异步加载数据,绑定搜索id和搜索微博按钮两个响应功能。还是用jQuery的ajax调用新浪微博加载对应的api数据。
  本练习中遇到的问题并不平均。一开始是不熟悉kendoUI造成的。在kendoUI中,所有页面内容都放在同一个页面上,但是data-role="view"是用来区分各个页面的。默认情况下,首页显示第一个收录属性data-role="view" div;
  接下来是api调用的跨域问题。本来打算用jsonp数据格式来解决这个问题,但是据说jscex可以解决这个问题。看了后面,发现jecex.js好像也是jsonp格式的。
  看了jscex的样例,感觉好强大。但这一次只是简单地使用它定义的异步方法,$await()、$start() 来使用异步方法。以下是点击搜索昵称按钮的一系列操作的代码:
  
  其实还有一个没有解决的问题:在遍历返回的数据时,如果去掉if(index)判断语句,结果总是返回一个“undefined”。经过调试,发现underfined对应的索引其实是code,是正确的。结果对应的索引是数据。实在是没有办法,只能用这个判断了。希望以后能找到原因。

网站调用新浪微博内容(试试用python调用微博API的SDK授权所必须的 )

网站优化优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-09-03 12:06 • 来自相关话题

  网站调用新浪微博内容(试试用python调用微博API的SDK授权所必须的
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写可以用这个地址代替,我试了一下,没问题,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
pprespan style="color: rgba(0, 128, 128, 1)"1/span api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span authorize_url =span style="color: rgba(0, 0, 0, 1)" api.get_authorize_url()
/spanspan style="color: rgba(0, 128, 128, 1)"3/span span style="color: rgba(0, 0, 255, 1)"print/spanspan style="color: rgba(0, 0, 0, 1)"(authorize_url)
/spanspan style="color: rgba(0, 128, 128, 1)"4/span webbrowser.open_new(authorize_url)/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/27174320-95b2c8e5fbaa430581575652dc9cabce.jpg' alt=''//p
p登录后会转成一个连接代码=92cc6accecfb5b2176adf58f4c/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
pprespan style="color: rgba(0, 128, 128, 1)"1/span request =span style="color: rgba(0, 0, 0, 1)" api.request_access_token(code, REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span access_token =span style="color: rgba(0, 0, 0, 1)" request.access_token
/spanspan style="color: rgba(0, 128, 128, 1)"3/span expires_in =span style="color: rgba(0, 0, 0, 1)" request.expires_in
/spanspan style="color: rgba(0, 128, 128, 1)"4/span span style="color: rgba(0, 0, 0, 1)"api.set_access_token(access_token, expires_in)
/spanspan style="color: rgba(0, 128, 128, 1)"5/span api.statuses.update.post(status=uspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Test OAuth 2.0 Send a Weibo!/spanspan style="color: rgba(128, 0, 0, 1)"'/span)/pre/p
pprespan style="font-size: 15px"access_token就是获得的token,expires_in是授权的过期时间/span span style="font-size: 15px"(UNIX时间)
/span/pre/p
pprespan style="font-size: 15px"用set_access_token保存授权。往下就可以调用微博接口了。测试发了一条微博
/span/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/28100233-96d97f1c16e14d11a07cc59330996baa.jpg' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
pimg src='https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif' alt=''//p
pimg src='https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif' alt=''//p
p访问微博/p
pprespan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" -*- coding: utf-8 -*- /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"/usr/bin/env python /span

span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"access to SinaWeibo By sinaweibopy /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"实现微博自动登录,token自动生成,保存及更新 /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"适合于后端服务调用 /span

span style="color: rgba(0, 0, 255, 1)"from/span weibo span style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" APIClient
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" pymongo
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" sys, os, urllib, urllib2
/spanspan style="color: rgba(0, 0, 255, 1)"from/span http_helper span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"from/span retry span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" json
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" ImportError:
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" simplejson as json

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" setting sys encoding to utf-8 /span
default_encoding = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"utf-8/spanspan style="color: rgba(128, 0, 0, 1)"'/span
span style="color: rgba(0, 0, 255, 1)"if/span sys.getdefaultencoding() !=span style="color: rgba(0, 0, 0, 1)" default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" weibo api访问配置 /span
APP_KEY = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app key /span
APP_SECRET = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app secret /span
REDIRECT_URL = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/default.html/spanspan style="color: rgba(128, 0, 0, 1)"'/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" callback url 授权回调页,与OAuth2.0 授权设置的一致 /span
USERID = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 登陆的微博用户名,必须是OAuth2.0 设置的测试账号 /span
USERPASSWD = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 用户密码 /span
span style="color: rgba(0, 0, 0, 1)"

client /span= APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" make_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"请求access token /span
params =span style="color: rgba(0, 0, 0, 1)" urllib.urlencode({
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"action/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"submit/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"withOfficalFlag/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"0/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"ticket/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"isLoginSina/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"response_type/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"code/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"regCallback/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"redirect_uri/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":REDIRECT_URL,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"client_id/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":APP_KEY,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"state/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"from/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"userId/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERID,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"passwd/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERPASSWD,
})

login_url /span= span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/authorize/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"

url /span=span style="color: rgba(0, 0, 0, 1)" client.get_authorize_url()
content /span=span style="color: rgba(0, 0, 0, 1)" urllib2.urlopen(url)
/spanspan style="color: rgba(0, 0, 255, 1)"if/spanspan style="color: rgba(0, 0, 0, 1)" content:
headers /span= { span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Referer/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)" : url }
request /span=span style="color: rgba(0, 0, 0, 1)" urllib2.Request(login_url, params, headers)
opener /span=span style="color: rgba(0, 0, 0, 1)" get_opener(False)
urllib2.install_opener(opener)
/spanspan style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
f /span=span style="color: rgba(0, 0, 0, 1)" opener.open(request)
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" f.url
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" urllib2.HTTPError, e:
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" e.geturl()
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 取到返回的code /span
code = return_redirect_uri.split(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"=/spanspan style="color: rgba(128, 0, 0, 1)"'/span)[1span style="color: rgba(0, 0, 0, 1)"]
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"得到token /span
token =span style="color: rgba(0, 0, 0, 1)" client.request_access_token(code,REDIRECT_URL)
save_access_token(token)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" save_access_token(token):
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"将access token保存到MongoDB数据库/span
mongoCon=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo

t/span=span style="color: rgba(0, 0, 0, 1)"{
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)""/span:token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"],
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)""/span:str(token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"]),
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"date/spanspan style="color: rgba(128, 0, 0, 1)""/span:time.strftime(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"%Y-%m-%d %H:%M:%S/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",time.localtime(time.time()))
}
db.token.insert(t,safe/span=span style="color: rgba(0, 0, 0, 1)"True)
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()/span
@retry(1span style="color: rgba(0, 0, 0, 1)")
/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" apply_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"从MongoDB读取及设置access token /span
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
mongoCon/span=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo
/spanspan style="color: rgba(0, 0, 255, 1)"if/span db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]

try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False

return True

if __name__ == "__main__":
apply_access_token()

# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
  
  重试.py
  import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.

delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff 0:
if rv == True or type(rv) == str: # Done on success ..
return rv
mtries -= 1 # consume an attempt
time.sleep(mdelay) # wait...
mdelay *= backoff # make future wait longer
rv = f(*args, **kwargs) # Try again
return False # Ran out of tries :-(
return f_retry # true decorator -> decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
   查看全部

  网站调用新浪微博内容(试试用python调用微博API的SDK授权所必须的
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写可以用这个地址代替,我试了一下,没问题,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
pprespan style="color: rgba(0, 128, 128, 1)"1/span api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span authorize_url =span style="color: rgba(0, 0, 0, 1)" api.get_authorize_url()
/spanspan style="color: rgba(0, 128, 128, 1)"3/span span style="color: rgba(0, 0, 255, 1)"print/spanspan style="color: rgba(0, 0, 0, 1)"(authorize_url)
/spanspan style="color: rgba(0, 128, 128, 1)"4/span webbrowser.open_new(authorize_url)/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/27174320-95b2c8e5fbaa430581575652dc9cabce.jpg' alt=''//p
p登录后会转成一个连接代码=92cc6accecfb5b2176adf58f4c/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
pprespan style="color: rgba(0, 128, 128, 1)"1/span request =span style="color: rgba(0, 0, 0, 1)" api.request_access_token(code, REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span access_token =span style="color: rgba(0, 0, 0, 1)" request.access_token
/spanspan style="color: rgba(0, 128, 128, 1)"3/span expires_in =span style="color: rgba(0, 0, 0, 1)" request.expires_in
/spanspan style="color: rgba(0, 128, 128, 1)"4/span span style="color: rgba(0, 0, 0, 1)"api.set_access_token(access_token, expires_in)
/spanspan style="color: rgba(0, 128, 128, 1)"5/span api.statuses.update.post(status=uspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Test OAuth 2.0 Send a Weibo!/spanspan style="color: rgba(128, 0, 0, 1)"'/span)/pre/p
pprespan style="font-size: 15px"access_token就是获得的token,expires_in是授权的过期时间/span span style="font-size: 15px"(UNIX时间)
/span/pre/p
pprespan style="font-size: 15px"用set_access_token保存授权。往下就可以调用微博接口了。测试发了一条微博
/span/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/28100233-96d97f1c16e14d11a07cc59330996baa.jpg' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
pimg src='https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif' alt=''//p
pimg src='https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif' alt=''//p
p访问微博/p
pprespan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" -*- coding: utf-8 -*- /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"/usr/bin/env python /span

span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"access to SinaWeibo By sinaweibopy /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"实现微博自动登录,token自动生成,保存及更新 /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"适合于后端服务调用 /span

span style="color: rgba(0, 0, 255, 1)"from/span weibo span style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" APIClient
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" pymongo
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" sys, os, urllib, urllib2
/spanspan style="color: rgba(0, 0, 255, 1)"from/span http_helper span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"from/span retry span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" json
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" ImportError:
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" simplejson as json

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" setting sys encoding to utf-8 /span
default_encoding = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"utf-8/spanspan style="color: rgba(128, 0, 0, 1)"'/span
span style="color: rgba(0, 0, 255, 1)"if/span sys.getdefaultencoding() !=span style="color: rgba(0, 0, 0, 1)" default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" weibo api访问配置 /span
APP_KEY = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app key /span
APP_SECRET = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app secret /span
REDIRECT_URL = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/default.html/spanspan style="color: rgba(128, 0, 0, 1)"'/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" callback url 授权回调页,与OAuth2.0 授权设置的一致 /span
USERID = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 登陆的微博用户名,必须是OAuth2.0 设置的测试账号 /span
USERPASSWD = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 用户密码 /span
span style="color: rgba(0, 0, 0, 1)"

client /span= APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" make_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"请求access token /span
params =span style="color: rgba(0, 0, 0, 1)" urllib.urlencode({
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"action/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"submit/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"withOfficalFlag/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"0/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"ticket/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"isLoginSina/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"response_type/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"code/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"regCallback/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"redirect_uri/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":REDIRECT_URL,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"client_id/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":APP_KEY,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"state/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"from/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"userId/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERID,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"passwd/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERPASSWD,
})

login_url /span= span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/authorize/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"

url /span=span style="color: rgba(0, 0, 0, 1)" client.get_authorize_url()
content /span=span style="color: rgba(0, 0, 0, 1)" urllib2.urlopen(url)
/spanspan style="color: rgba(0, 0, 255, 1)"if/spanspan style="color: rgba(0, 0, 0, 1)" content:
headers /span= { span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Referer/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)" : url }
request /span=span style="color: rgba(0, 0, 0, 1)" urllib2.Request(login_url, params, headers)
opener /span=span style="color: rgba(0, 0, 0, 1)" get_opener(False)
urllib2.install_opener(opener)
/spanspan style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
f /span=span style="color: rgba(0, 0, 0, 1)" opener.open(request)
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" f.url
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" urllib2.HTTPError, e:
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" e.geturl()
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 取到返回的code /span
code = return_redirect_uri.split(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"=/spanspan style="color: rgba(128, 0, 0, 1)"'/span)[1span style="color: rgba(0, 0, 0, 1)"]
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"得到token /span
token =span style="color: rgba(0, 0, 0, 1)" client.request_access_token(code,REDIRECT_URL)
save_access_token(token)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" save_access_token(token):
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"将access token保存到MongoDB数据库/span
mongoCon=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo

t/span=span style="color: rgba(0, 0, 0, 1)"{
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)""/span:token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"],
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)""/span:str(token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"]),
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"date/spanspan style="color: rgba(128, 0, 0, 1)""/span:time.strftime(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"%Y-%m-%d %H:%M:%S/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",time.localtime(time.time()))
}
db.token.insert(t,safe/span=span style="color: rgba(0, 0, 0, 1)"True)
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()/span
@retry(1span style="color: rgba(0, 0, 0, 1)")
/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" apply_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"从MongoDB读取及设置access token /span
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
mongoCon/span=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo
/spanspan style="color: rgba(0, 0, 255, 1)"if/span db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]

try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False

return True

if __name__ == "__main__":
apply_access_token()

# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
  
  重试.py
  import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.

delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff 0:
if rv == True or type(rv) == str: # Done on success ..
return rv
mtries -= 1 # consume an attempt
time.sleep(mdelay) # wait...
mdelay *= backoff # make future wait longer
rv = f(*args, **kwargs) # Try again
return False # Ran out of tries :-(
return f_retry # true decorator -> decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
  

网站调用新浪微博内容(微软人脉应用面临没有接口可供调用的困境(组图))

网站优化优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2021-09-02 19:07 • 来自相关话题

  网站调用新浪微博内容(微软人脉应用面临没有接口可供调用的困境(组图))
  原人网应用通过微博API接口实时获取用户微博联系人、更新、评论等,也可以直接通过人网应用发布新微博。
  
  然而,新浪微博最近更新了API接口、网络应用等相关应用,都面临着无接口调用的困境。
  微软在邮件中指出,如果用户已经将新浪微博链接到人民网应用程序,人民网应用程序将不再收到新信息,例如新联系人、评论等。
  如果用户之前没有将微博与人脉应用绑定,则无法再绑定。
  “分享到微博”功能也受到影响。微软表示,分享到微博功能也已于3月31日停止服务。
  以下是所有受影响的 Microsoft 产品:
  Outlook、Windows、Windows Phone 和 Office 365 日历同步(影响联系人同步) 联系人(影响联系人同步) Windows 8.1 和 Windows 8 个人连接(影响联系人同步) Windows 8.1 和 Windows 8 日历应用程序(影响联系人同步) Windows 8 照片库和视频制作(不能直接分享照片或视频到微博) Windows 8 照片应用程序(不能直接分享照片到微博) Windows Phone 8.1 和 Windows Phone 8 人物应用程序(影响联系人)同步) Windows Phone 8 和 Windows Phone 7 OneDrive(影响联系人同步) Windows Phone 8 和 Windows Phone 7 照片(不能直接分享照片到微博) Windows Live 包日历和联系人(影响联系人同步) OneDrive(不能直接发布照片存储在 OneDrive 到微博)Office 连接服务(查看 Office 帐户时,微博将不再显示为连接服务) Outl ook in Outlook 2016 和 Outlook 2013 Social Connector(OSC会直接提示密码错误,动态无法更新,可以直接删除微博连接)Office 365Web上的Outlook(影响联系人同步)
  目前新浪微博开放平台收紧,很多原有API被限制或不能直接调用。这也遭到了大量开发者的谴责。
  在之前的API调整中,微博曾经限制第三方微博客户端获取用户的关注、粉丝和微博内容。大量第三方微博客户端正在慢慢消失。
  可以预见,微博的API会继续收紧,需要使用其API的开发者应提前做好准备,以免影响开发产品的正常使用。
  关于微软的详细通知可以在这里找到:新浪微博连接将不可用 查看全部

  网站调用新浪微博内容(微软人脉应用面临没有接口可供调用的困境(组图))
  原人网应用通过微博API接口实时获取用户微博联系人、更新、评论等,也可以直接通过人网应用发布新微博。
  
  然而,新浪微博最近更新了API接口、网络应用等相关应用,都面临着无接口调用的困境。
  微软在邮件中指出,如果用户已经将新浪微博链接到人民网应用程序,人民网应用程序将不再收到新信息,例如新联系人、评论等。
  如果用户之前没有将微博与人脉应用绑定,则无法再绑定。
  “分享到微博”功能也受到影响。微软表示,分享到微博功能也已于3月31日停止服务。
  以下是所有受影响的 Microsoft 产品:
  Outlook、Windows、Windows Phone 和 Office 365 日历同步(影响联系人同步) 联系人(影响联系人同步) Windows 8.1 和 Windows 8 个人连接(影响联系人同步) Windows 8.1 和 Windows 8 日历应用程序(影响联系人同步) Windows 8 照片库和视频制作(不能直接分享照片或视频到微博) Windows 8 照片应用程序(不能直接分享照片到微博) Windows Phone 8.1 和 Windows Phone 8 人物应用程序(影响联系人)同步) Windows Phone 8 和 Windows Phone 7 OneDrive(影响联系人同步) Windows Phone 8 和 Windows Phone 7 照片(不能直接分享照片到微博) Windows Live 包日历和联系人(影响联系人同步) OneDrive(不能直接发布照片存储在 OneDrive 到微博)Office 连接服务(查看 Office 帐户时,微博将不再显示为连接服务) Outl ook in Outlook 2016 和 Outlook 2013 Social Connector(OSC会直接提示密码错误,动态无法更新,可以直接删除微博连接)Office 365Web上的Outlook(影响联系人同步)
  目前新浪微博开放平台收紧,很多原有API被限制或不能直接调用。这也遭到了大量开发者的谴责。
  在之前的API调整中,微博曾经限制第三方微博客户端获取用户的关注、粉丝和微博内容。大量第三方微博客户端正在慢慢消失。
  可以预见,微博的API会继续收紧,需要使用其API的开发者应提前做好准备,以免影响开发产品的正常使用。
  关于微软的详细通知可以在这里找到:新浪微博连接将不可用

网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-08-30 03:02 • 来自相关话题

  网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)
  要求
  手头的一个应用需要添加分享到新浪微博的功能。这个功能在目前的应用中很常见。
  分享到新浪微博其实就是发一条特定内容的微博,所以需要新浪微博SDK。
  微博SDK
  SDK 下载链接收录了很多平台的包,包括安卓版本。
  下载后请务必阅读SDK文档,运行自带的demo,对SDK的使用有一个大致的了解。
  发微博的麻烦
  运行DEMO后发现发送微博的功能是通过调用微博客户端实现的。如果用户没有安装,会提示用户下载或选择放弃发送。 . 这显然是不可靠的,因为还有很多用户没有安装微博客户端。
  
  网上很多人也遇到过这个问题。从他们的说法来看,之前版本的微博SDK好像还有发送微博的功能,但是新版本的SDK中已经没有了。
  但是demo里面有个提示:如果不想用微博客户端分享,请参考OpenAPI。
  那我们来看看这个OpenAPI有哪些功能。
  开放API
  OpenAPI 文档:%E5%BE%AE%E5%8D%9AAPI
  可以看出OpenAPI是通过Http请求来进行一些操作的,可以进行的操作基本涵盖了微博应用的方方面面。
  我们找到了发送微博的API:status/update
  文档的描述很详细。接口通过POST方法改变。请求参数有很多,但只有一个是必须的。但是要改界面,需要登录,所以必须在参数中加上已经授权登录的AccessToken:
  参数名称必须选择类型和作用域描述
  状态
  真实
  字符串
  要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字。
  访问令牌
  真实
  字符串
  登录后获得,详情见后文
  现在,发送微博的逻辑很清楚了,就是一个post请求。另一个需要解决的问题是AccessToken,即登录授权。
  登录授权
  并不是想让用户在你的应用中登录微博直接写代码,因为用户在你的应用中输入了账号信息,所以为了用户的账号安全,这是有风险的,所以如果你的应用需要添加微博功能,需要新浪审核。这个过程我还没有完全走完,大家可以参考微博文档的帮助:手机客户端访问
  这个文章主要是讲程序的,就不纠结这些过程了。简而言之,我们需要的是一个APPKEY,它是登录授权所需要的。我们现在可以使用SDK微博应用demo的APPKEY进行实验了。
  DEMO练习步骤因为使用微博DEMO的APPKEY,所以需要替换默认的debug.keystore
  在 C:\Users\XXXXX.android 目录中,将 Android 默认的 debug.keystore 替换为 GitHub 上提供的官方 debug.keystore。
  请注意:这一步是必须的。如果没有替换,演示程序在运行时将无法正确授权成功。在更换之前,最好备份一下原来的debug.keystore。另外,debug.keysotre 是新浪官方的。除编译运行官方DEMO外,请勿直接使用。出于安全原因,您应该为您的应用程序提供一个密钥。创建一个新的android项目,并将包命名为:com.sina.weibo.sdk.demo 将微博DEMO中的Constants.java复制到项目中
  在 AndroidManifest.xml 中添加权限:
  主界面的代码,登录授权部分的代码直接取自微博官方demo,发送微博部分就是上面分析的实现:
   public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
/** 微博 Web 授权类,提供登陆等功能 */
private WeiboAuth mWeiboAuth;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
private TextView mTokenInfoTV;
private EditText mMessageET;
private Button mSendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mTokenInfoTV = (TextView) findViewById(R.id.textView_tokenInfo);
mMessageET = (EditText) findViewById(R.id.editText_message);
mSendBtn = (Button) findViewById(R.id.button_sendWeibo);
// 获取Token
findViewById(R.id.button_getToken).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWeiboAuth.anthorize(new AuthListener());
}
});
// 发送微博
mMessageET.setVisibility(View.GONE);
mSendBtn.setVisibility(View.GONE);
mSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendWeibo(mMessageET.getText().toString());
}
});
}
// 发送微博
protected void sendWeibo(String string) {
//组织post参数
List params = new LinkedList();
params.add(new BasicNameValuePair("status", string));
params.add(new BasicNameValuePair("access_token", mAccessToken.getToken()));
HttpClient httpClient = new DefaultHttpClient();
//传入post方法的请求地址,即发送微博的api接口
HttpPost postMethod = new HttpPost("https://api.weibo.com/2/statuses/update.json");
try {
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
HttpResponse httpResponse = httpClient.execute(postMethod);
//将返回结果转为字符串,通过文档可知返回结果为json字符串,结构请参考文档
String resultStr=EntityUtils.toString(httpResponse.getEntity());
Log.e(TAG, resultStr);
//从json字符串中建立JSONObject
JSONObject resultJson = new JSONObject(resultStr);
//如果发送微博失败的话,返回字段中有"error"字段,通过判断是否存在该字段即可知道是否发送成功
if (resultJson.has("error")) {
Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show();
}
} catch (UnsupportedEncodingException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ClientProtocolException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (IOException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ParseException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (JSONException e) {
Log.e(TAG, e.getLocalizedMessage());
}
}
//登录授权接口
class AuthListener implements WeiboAuthListener {
//登录成功
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView();
// 显示发送微博的按钮和输入框
mSendBtn.setVisibility(View.VISIBLE);
mMessageET.setVisibility(View.VISIBLE);
// 保存 Token 到 SharedPreferences
// AccessTokenKeeper.writeAccessToken(MainActivity.this,
// mAccessToken);
Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
} else {
// 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
String code = values.getString("code");
String message = "授权失败";
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "取消授权", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
//显示token信息
private void updateTokenView() {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken
.getExpiresTime()));
String format = "Token:%1$s \n有效期:%2$s";
mTokenInfoTV.setText(String.format(format, mAccessToken.getToken(), date));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
  主界面的布局代码:
  运行效果
  
  
  
  发微博DEMO下载地址 查看全部

  网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)
  要求
  手头的一个应用需要添加分享到新浪微博的功能。这个功能在目前的应用中很常见。
  分享到新浪微博其实就是发一条特定内容的微博,所以需要新浪微博SDK。
  微博SDK
  SDK 下载链接收录了很多平台的包,包括安卓版本。
  下载后请务必阅读SDK文档,运行自带的demo,对SDK的使用有一个大致的了解。
  发微博的麻烦
  运行DEMO后发现发送微博的功能是通过调用微博客户端实现的。如果用户没有安装,会提示用户下载或选择放弃发送。 . 这显然是不可靠的,因为还有很多用户没有安装微博客户端。
  
  网上很多人也遇到过这个问题。从他们的说法来看,之前版本的微博SDK好像还有发送微博的功能,但是新版本的SDK中已经没有了。
  但是demo里面有个提示:如果不想用微博客户端分享,请参考OpenAPI。
  那我们来看看这个OpenAPI有哪些功能。
  开放API
  OpenAPI 文档:%E5%BE%AE%E5%8D%9AAPI
  可以看出OpenAPI是通过Http请求来进行一些操作的,可以进行的操作基本涵盖了微博应用的方方面面。
  我们找到了发送微博的API:status/update
  文档的描述很详细。接口通过POST方法改变。请求参数有很多,但只有一个是必须的。但是要改界面,需要登录,所以必须在参数中加上已经授权登录的AccessToken:
  参数名称必须选择类型和作用域描述
  状态
  真实
  字符串
  要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字。
  访问令牌
  真实
  字符串
  登录后获得,详情见后文
  现在,发送微博的逻辑很清楚了,就是一个post请求。另一个需要解决的问题是AccessToken,即登录授权。
  登录授权
  并不是想让用户在你的应用中登录微博直接写代码,因为用户在你的应用中输入了账号信息,所以为了用户的账号安全,这是有风险的,所以如果你的应用需要添加微博功能,需要新浪审核。这个过程我还没有完全走完,大家可以参考微博文档的帮助:手机客户端访问
  这个文章主要是讲程序的,就不纠结这些过程了。简而言之,我们需要的是一个APPKEY,它是登录授权所需要的。我们现在可以使用SDK微博应用demo的APPKEY进行实验了。
  DEMO练习步骤因为使用微博DEMO的APPKEY,所以需要替换默认的debug.keystore
  在 C:\Users\XXXXX.android 目录中,将 Android 默认的 debug.keystore 替换为 GitHub 上提供的官方 debug.keystore。
  请注意:这一步是必须的。如果没有替换,演示程序在运行时将无法正确授权成功。在更换之前,最好备份一下原来的debug.keystore。另外,debug.keysotre 是新浪官方的。除编译运行官方DEMO外,请勿直接使用。出于安全原因,您应该为您的应用程序提供一个密钥。创建一个新的android项目,并将包命名为:com.sina.weibo.sdk.demo 将微博DEMO中的Constants.java复制到项目中
  在 AndroidManifest.xml 中添加权限:
  主界面的代码,登录授权部分的代码直接取自微博官方demo,发送微博部分就是上面分析的实现:
   public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
/** 微博 Web 授权类,提供登陆等功能 */
private WeiboAuth mWeiboAuth;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
private TextView mTokenInfoTV;
private EditText mMessageET;
private Button mSendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mTokenInfoTV = (TextView) findViewById(R.id.textView_tokenInfo);
mMessageET = (EditText) findViewById(R.id.editText_message);
mSendBtn = (Button) findViewById(R.id.button_sendWeibo);
// 获取Token
findViewById(R.id.button_getToken).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWeiboAuth.anthorize(new AuthListener());
}
});
// 发送微博
mMessageET.setVisibility(View.GONE);
mSendBtn.setVisibility(View.GONE);
mSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendWeibo(mMessageET.getText().toString());
}
});
}
// 发送微博
protected void sendWeibo(String string) {
//组织post参数
List params = new LinkedList();
params.add(new BasicNameValuePair("status", string));
params.add(new BasicNameValuePair("access_token", mAccessToken.getToken()));
HttpClient httpClient = new DefaultHttpClient();
//传入post方法的请求地址,即发送微博的api接口
HttpPost postMethod = new HttpPost("https://api.weibo.com/2/statuses/update.json";);
try {
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
HttpResponse httpResponse = httpClient.execute(postMethod);
//将返回结果转为字符串,通过文档可知返回结果为json字符串,结构请参考文档
String resultStr=EntityUtils.toString(httpResponse.getEntity());
Log.e(TAG, resultStr);
//从json字符串中建立JSONObject
JSONObject resultJson = new JSONObject(resultStr);
//如果发送微博失败的话,返回字段中有"error"字段,通过判断是否存在该字段即可知道是否发送成功
if (resultJson.has("error")) {
Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show();
}
} catch (UnsupportedEncodingException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ClientProtocolException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (IOException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ParseException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (JSONException e) {
Log.e(TAG, e.getLocalizedMessage());
}
}
//登录授权接口
class AuthListener implements WeiboAuthListener {
//登录成功
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView();
// 显示发送微博的按钮和输入框
mSendBtn.setVisibility(View.VISIBLE);
mMessageET.setVisibility(View.VISIBLE);
// 保存 Token 到 SharedPreferences
// AccessTokenKeeper.writeAccessToken(MainActivity.this,
// mAccessToken);
Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
} else {
// 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
String code = values.getString("code");
String message = "授权失败";
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "取消授权", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
//显示token信息
private void updateTokenView() {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken
.getExpiresTime()));
String format = "Token:%1$s \n有效期:%2$s";
mTokenInfoTV.setText(String.format(format, mAccessToken.getToken(), date));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
  主界面的布局代码:
  运行效果
  
  
  
  发微博DEMO下载地址

网站调用新浪微博内容(网站调用新浪微博内容,并根据新浪开放平台返回给网站的内容经过若干次的拆分混淆,)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-08-29 03:02 • 来自相关话题

  网站调用新浪微博内容(网站调用新浪微博内容,并根据新浪开放平台返回给网站的内容经过若干次的拆分混淆,)
  网站调用新浪微博内容,并根据新浪微博的api开放平台返回给网站的内容经过若干次的拆分混淆,就变成了今天这个样子,其实twitter调用的是推特这个api,新浪的这个爬虫api是新浪在处理推特的微博后添加上去的
  每个微博都相当于一条新浪的关联记录:点赞,评论,转发等等都会被记录。如果博主不想再计算这些点赞和转发就不点赞和转发,直接把点赞记录清空就好。再说了,
  看看199it上面的信息采集,选择一个排名高,规模大的博客,等写好代码后,我们一起来看看采集结果。
  加上新浪微博的api
  我用的是jsps家的一个技术小哥研发的工具,直接读取传入的api方可进行抓取。
  用户的转发只是多了一步读取的过程。
  因为微博只是新浪系统的一部分
  因为微博只是新浪系统的一部分,而且博客未被关注的有可能成为僵尸粉。
  新浪博客已经关闭,
  都是瞎扯,微博是新浪系统的一部分,
  弱爆了,今天我为了采集新浪微博内容,爬了六层架构。
  因为新浪网站上读取的不是微博内容。而是新浪内容的互动内容,我们称之为热门微博的rssextractor。这种爬虫会让新浪的读取速度更快。
  都被猜中了o(∩_∩)o哈哈~而且貌似有很多人的截图是别人抓取的原微博地址, 查看全部

  网站调用新浪微博内容(网站调用新浪微博内容,并根据新浪开放平台返回给网站的内容经过若干次的拆分混淆,)
  网站调用新浪微博内容,并根据新浪微博的api开放平台返回给网站的内容经过若干次的拆分混淆,就变成了今天这个样子,其实twitter调用的是推特这个api,新浪的这个爬虫api是新浪在处理推特的微博后添加上去的
  每个微博都相当于一条新浪的关联记录:点赞,评论,转发等等都会被记录。如果博主不想再计算这些点赞和转发就不点赞和转发,直接把点赞记录清空就好。再说了,
  看看199it上面的信息采集,选择一个排名高,规模大的博客,等写好代码后,我们一起来看看采集结果。
  加上新浪微博的api
  我用的是jsps家的一个技术小哥研发的工具,直接读取传入的api方可进行抓取。
  用户的转发只是多了一步读取的过程。
  因为微博只是新浪系统的一部分
  因为微博只是新浪系统的一部分,而且博客未被关注的有可能成为僵尸粉。
  新浪博客已经关闭,
  都是瞎扯,微博是新浪系统的一部分,
  弱爆了,今天我为了采集新浪微博内容,爬了六层架构。
  因为新浪网站上读取的不是微博内容。而是新浪内容的互动内容,我们称之为热门微博的rssextractor。这种爬虫会让新浪的读取速度更快。
  都被猜中了o(∩_∩)o哈哈~而且貌似有很多人的截图是别人抓取的原微博地址,

网站调用新浪微博内容(api发新微博网上现有教程中的发送微博接口(updateStatus),)

网站优化优采云 发表了文章 • 0 个评论 • 139 次浏览 • 2021-08-28 15:13 • 来自相关话题

  网站调用新浪微博内容(api发新微博网上现有教程中的发送微博接口(updateStatus),)
  最近有一个项目需要调用微博API来发布新的微博。在网上找了很多相关的教程,遇到了很多坑。后来发邮件给官方发现微博官方早在2017年3月就调整了相关接口,取消了现有在线教程中的微博发送接口(updateStatus),导致调用该接口导致权限不足再次。 ,当时折腾了半天。特此发个新文章,希望大家不要掉坑。
  首先登录开放平台创建应用
  首先,您需要到微博开放平台申请开发者账号创建新应用。您可以直接使用您的微博帐户登录。登录后点击微连接选择其他,根据需要选择新建应用(客户端、网页应用和浏览器插件)。
  
  二、应用相关设置
  首先在应用信息中编辑应用的基本信息,包括应用介绍的目的。一定要填写安全域名,自己测试的时候随便填写即可。申请企业时需填写企业相关域名。
  
  您还需要在应用高级信息中设置OAuth2.0的授权回调页面。您也可以在本次测试中随意填写。当应用程序发起用户授权时,会成功或取消重定向的页面地址。
  
  三、下载微博java sdk
  点击sdk下载地址,跳转回github页面。页面上有示例提示如何使用,下载即可。下载后,将其导入代码编辑器。最重要的一步:修改config.properties文件中的字段值。值的来源在应用信息中。
  
  四、运行实例获取授权码
  修改配置文件后,先打开examples包下oauth2.0下的OAuth4Code.java文件,直接运行main方法。此时,默认浏览器会打开用户授权页面。授权后浏览器地址最后会加一个code=******。将代码复制粘贴到编辑器控制台,然后回车返回授权信息。
  复制返回的授权信息中accessToken的值,即授权码。
  AccessToken [accessToken=2.00******, expireIn=11255**, refreshToken=,uid=****] 有了这个授权码,我们就可以正式运营微博了。
  注意:微博api中的所有操作都需要得到OAuth2.0的授权。每种方法都需要一个授权码。未经审核的应用程序授权码仅在一天内有效。有效期为30天,如果获得应用所属开发者授权,则为5年。因此,开发者在调用时需要确定授权码的有效期,到期后应引导用户重新授权。
  五、api应用的微博
  examples包下都是官方微博API实例,之前的微博发送接口在weibo4j.examples.timeline下。其中UpdateStatus.java和Upload.java是发送微博文本,另一个是发送带图片的微博实例。打开之后发现发送的微博都是调用weibo4j.Timeline.java这个类。
  不过,微博官方已经取消了updateStatus等相关的微博发送接口,这些接口已经不能再调用了,但是因为java SDK是2014版本,这些方法还是存在的。后续替换之前的updateStatus接口是status/share(第三方分享链接到微博)
  
  我们使用这个接口发送微博。由于java sdk是2014版本,这个版本没有这个接口方法,所以我们需要根据他的调用方法来写一个新的接口。因为接口只有两个必填参数,一个微博文本和授权码,类似于updateStatus。所以我们可以打开weibo4j.Timeline.java找到updateStatus方法,复制一份,改方法名,替换json。这样发微博不带图的方法就完成了。
   
  public Status updateStatus(String status) 抛出 WeiboException {
  返回新状态(client.post(WeiboConfig.getValue("baseURL")
  + "statuses/update.json",
  new PostParameter[] {new PostParameter("status", status) },
  access_token));
  }
  /** 查看全部

  网站调用新浪微博内容(api发新微博网上现有教程中的发送微博接口(updateStatus),)
  最近有一个项目需要调用微博API来发布新的微博。在网上找了很多相关的教程,遇到了很多坑。后来发邮件给官方发现微博官方早在2017年3月就调整了相关接口,取消了现有在线教程中的微博发送接口(updateStatus),导致调用该接口导致权限不足再次。 ,当时折腾了半天。特此发个新文章,希望大家不要掉坑。
  首先登录开放平台创建应用
  首先,您需要到微博开放平台申请开发者账号创建新应用。您可以直接使用您的微博帐户登录。登录后点击微连接选择其他,根据需要选择新建应用(客户端、网页应用和浏览器插件)。
  
  二、应用相关设置
  首先在应用信息中编辑应用的基本信息,包括应用介绍的目的。一定要填写安全域名,自己测试的时候随便填写即可。申请企业时需填写企业相关域名。
  
  您还需要在应用高级信息中设置OAuth2.0的授权回调页面。您也可以在本次测试中随意填写。当应用程序发起用户授权时,会成功或取消重定向的页面地址。
  
  三、下载微博java sdk
  点击sdk下载地址,跳转回github页面。页面上有示例提示如何使用,下载即可。下载后,将其导入代码编辑器。最重要的一步:修改config.properties文件中的字段值。值的来源在应用信息中。
  
  四、运行实例获取授权码
  修改配置文件后,先打开examples包下oauth2.0下的OAuth4Code.java文件,直接运行main方法。此时,默认浏览器会打开用户授权页面。授权后浏览器地址最后会加一个code=******。将代码复制粘贴到编辑器控制台,然后回车返回授权信息。
  复制返回的授权信息中accessToken的值,即授权码。
  AccessToken [accessToken=2.00******, expireIn=11255**, refreshToken=,uid=****] 有了这个授权码,我们就可以正式运营微博了。
  注意:微博api中的所有操作都需要得到OAuth2.0的授权。每种方法都需要一个授权码。未经审核的应用程序授权码仅在一天内有效。有效期为30天,如果获得应用所属开发者授权,则为5年。因此,开发者在调用时需要确定授权码的有效期,到期后应引导用户重新授权。
  五、api应用的微博
  examples包下都是官方微博API实例,之前的微博发送接口在weibo4j.examples.timeline下。其中UpdateStatus.java和Upload.java是发送微博文本,另一个是发送带图片的微博实例。打开之后发现发送的微博都是调用weibo4j.Timeline.java这个类。
  不过,微博官方已经取消了updateStatus等相关的微博发送接口,这些接口已经不能再调用了,但是因为java SDK是2014版本,这些方法还是存在的。后续替换之前的updateStatus接口是status/share(第三方分享链接到微博)
  
  我们使用这个接口发送微博。由于java sdk是2014版本,这个版本没有这个接口方法,所以我们需要根据他的调用方法来写一个新的接口。因为接口只有两个必填参数,一个微博文本和授权码,类似于updateStatus。所以我们可以打开weibo4j.Timeline.java找到updateStatus方法,复制一份,改方法名,替换json。这样发微博不带图的方法就完成了。
   
  public Status updateStatus(String status) 抛出 WeiboException {
  返回新状态(client.post(WeiboConfig.getValue("baseURL")
  + "statuses/update.json",
  new PostParameter[] {new PostParameter("status", status) },
  access_token));
  }
  /**

网站调用新浪微博内容(iOS开发中,分享到公众平台常用的第三方SDK)

网站优化优采云 发表了文章 • 0 个评论 • 134 次浏览 • 2021-08-28 15:10 • 来自相关话题

  网站调用新浪微博内容(iOS开发中,分享到公众平台常用的第三方SDK)
  ShareSDK 是 iOS 开发中常用的第三方 SDK,共享给公共平台。其友好的包装使分享更容易。您只需要根据各个平台的分享情况,调用分享方法,构造需要的参数即可。没关系。我用ShareSDK分享过很多次了,分享到新浪微博是我觉得最有可能遇到的,尤其是ios9之后。在这里与您分享经验,避免不可避免的问题。
  现在最新版本的ShareSDK已经达到3.x,比之前的版本更加简洁。这里就不介绍了,官方文档已经很清楚了。我直接分享如何融入成功的过程。使用pod下载ShareSDK,省去添加需要的框架和一些配置,推荐大家使用
  1.填写白名单。六个最好都写:sinaweibo sinaweibohd sinaweibosso sinaweibohdsso weibosdk weibosdk2.5(如果导入新浪SDK需要后两个)
  2.填写方案。 Scheme的正确与否直接影响分享到新浪微博客户端能否跳转回自己的应用。填错了就回不来了,也不会收到分享状态结果的回调。新浪微博Scheme规则:wb+appKey。
  3.初始化新浪微博平台:下面authType选择SDKAuthTypeBoth,支持web端和新浪微博客户端。 SSDKAuthTypeWeb 仅支持网页授权。大家要注意,网页授权是在app内共享的。第一次授权时弹出授权界面后,一旦授权成功,以后点击分享不会重定向,可以直接在app中分享。获取共享回调。客户端下共享,每次第一次授权后都会重定向到客户端。
  
  4. 构造共享参数信息。 shareParams 是一个参数信息字典。新浪微博构建信息参数的方法与其他平台略有不同。 (1)。新浪微博原来不能分享链接,他只能分享文字和图片,不像微信,所以不要想像微信一样直接带一个shareUrl,直接点击看网页。2) .如果你想在微博上分享一个链接,你只能用文字来写。作为内容分享。分享。微博会将链接显示为网页链接。点击网页链接,您可以跳转到链接。使用其他应用分享到新浪微博进行验证。(3)这里我强调一下,在新浪微博的参数信息中,图片字段,如果你想上传网络图片,你必须有一个高级的写作界面,并且需要去新浪微博公众平台申请,否则会报错。为避免此类问题,可以使用本地图片,或者从网上下载图片。如果要问为什么客户端分享没有找到这个问题,是因为两种方式共享的内部接口不同,客户端共享不会有这个错误prob lem,只有网页。
  
  5. 允许客户端共享。 [shareParams SSDKEnableUseClientShare];这句话的意思是允许客户端共享。如果有客户端,在新浪微博平台分享会调用新浪微博客户端。当然,如果没有安装客户端,web端的共享不会受到影响。
  6.分享方式的调用选项。
  (1)使用ShareSDK系统弹框分享:参考ShareSDK官方demo,可以知道它的风格。
  
  (2)使用ShareSDK系统的编辑框进行分享,点击你想要的分享平台按钮,会弹出默认的编辑框:参考ShareSDK官方demo了解其风格。
  
  (3)直接跳转到第三方平台分享。点击你的app中代表某个平台的按钮,可以直接跳转到第三方平台分享。不需要经过中间过程
  
  (4)选择直接跳转到新浪微博分享的方式,跳转到新浪微博客户端后的显示方式
  
  (5)。点击发送,可以在网络情况下分享成功,然后传回自己的app。如果Scheme配置错了,就不会跳回来了,切记。整体是这样的过程是,你有我没想到的简单。 查看全部

  网站调用新浪微博内容(iOS开发中,分享到公众平台常用的第三方SDK)
  ShareSDK 是 iOS 开发中常用的第三方 SDK,共享给公共平台。其友好的包装使分享更容易。您只需要根据各个平台的分享情况,调用分享方法,构造需要的参数即可。没关系。我用ShareSDK分享过很多次了,分享到新浪微博是我觉得最有可能遇到的,尤其是ios9之后。在这里与您分享经验,避免不可避免的问题。
  现在最新版本的ShareSDK已经达到3.x,比之前的版本更加简洁。这里就不介绍了,官方文档已经很清楚了。我直接分享如何融入成功的过程。使用pod下载ShareSDK,省去添加需要的框架和一些配置,推荐大家使用
  1.填写白名单。六个最好都写:sinaweibo sinaweibohd sinaweibosso sinaweibohdsso weibosdk weibosdk2.5(如果导入新浪SDK需要后两个)
  2.填写方案。 Scheme的正确与否直接影响分享到新浪微博客户端能否跳转回自己的应用。填错了就回不来了,也不会收到分享状态结果的回调。新浪微博Scheme规则:wb+appKey。
  3.初始化新浪微博平台:下面authType选择SDKAuthTypeBoth,支持web端和新浪微博客户端。 SSDKAuthTypeWeb 仅支持网页授权。大家要注意,网页授权是在app内共享的。第一次授权时弹出授权界面后,一旦授权成功,以后点击分享不会重定向,可以直接在app中分享。获取共享回调。客户端下共享,每次第一次授权后都会重定向到客户端。
  
  4. 构造共享参数信息。 shareParams 是一个参数信息字典。新浪微博构建信息参数的方法与其他平台略有不同。 (1)。新浪微博原来不能分享链接,他只能分享文字和图片,不像微信,所以不要想像微信一样直接带一个shareUrl,直接点击看网页。2) .如果你想在微博上分享一个链接,你只能用文字来写。作为内容分享。分享。微博会将链接显示为网页链接。点击网页链接,您可以跳转到链接。使用其他应用分享到新浪微博进行验证。(3)这里我强调一下,在新浪微博的参数信息中,图片字段,如果你想上传网络图片,你必须有一个高级的写作界面,并且需要去新浪微博公众平台申请,否则会报错。为避免此类问题,可以使用本地图片,或者从网上下载图片。如果要问为什么客户端分享没有找到这个问题,是因为两种方式共享的内部接口不同,客户端共享不会有这个错误prob lem,只有网页。
  
  5. 允许客户端共享。 [shareParams SSDKEnableUseClientShare];这句话的意思是允许客户端共享。如果有客户端,在新浪微博平台分享会调用新浪微博客户端。当然,如果没有安装客户端,web端的共享不会受到影响。
  6.分享方式的调用选项。
  (1)使用ShareSDK系统弹框分享:参考ShareSDK官方demo,可以知道它的风格。
  
  (2)使用ShareSDK系统的编辑框进行分享,点击你想要的分享平台按钮,会弹出默认的编辑框:参考ShareSDK官方demo了解其风格。
  
  (3)直接跳转到第三方平台分享。点击你的app中代表某个平台的按钮,可以直接跳转到第三方平台分享。不需要经过中间过程
  
  (4)选择直接跳转到新浪微博分享的方式,跳转到新浪微博客户端后的显示方式
  
  (5)。点击发送,可以在网络情况下分享成功,然后传回自己的app。如果Scheme配置错了,就不会跳回来了,切记。整体是这样的过程是,你有我没想到的简单。

新浪微博是利用feed找到更新文章的模板,成功关联

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2021-08-19 07:09 • 来自相关话题

  新浪微博是利用feed找到更新文章的模板,成功关联
  新浪微博使用提要查找更新文章。只要给他指定feed地址,就可以成功关联。
  现在开始简单的修改织梦的模板。由于织梦无法生成整个站点的xml文件,所以我们首先要建立一个php程序,生成整个站点的xml。
  1、创建feed.php
  上面要注意的是修改模板的路径,保证在模板和目录下可以找到feed.htm
  2、创建feed.htm模板文件
  



{dede:global.cfg_webname/}
{dede:global.cfg_basehost/}
{dede:global.cfg_description/}
zh-cn
{dede:global.cfg_webname/}
{dede:global.cfg_adminemail/}
{dede:arclist row=&#39;60′ col=&#39;1′ titlelen=&#39;100′ orderby=&#39;pubdate&#39;}

[field:arcurl/]

[field:writer/]
[field:typename/]
[field:pubdate function=&#39;strftime("%a, %d %b %Y %H:%M:%S +0800",@me)&#39;/]
[field:arcurl/]


{/dede:arclist}


  请注意,不要忘记将我的 URL 更改为您需要的内容。
  3、修改index.htm首页模板
  由于新浪微博只能验证网址,无法写出完整路径。比如我写的是:。结果表明关联失败。解决方法是在中间添加如下代码
  您可以通过以上方式成功关联新浪微博。
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持九云大使。 查看全部

  新浪微博是利用feed找到更新文章的模板,成功关联
  新浪微博使用提要查找更新文章。只要给他指定feed地址,就可以成功关联。
  现在开始简单的修改织梦的模板。由于织梦无法生成整个站点的xml文件,所以我们首先要建立一个php程序,生成整个站点的xml。
  1、创建feed.php
  上面要注意的是修改模板的路径,保证在模板和目录下可以找到feed.htm
  2、创建feed.htm模板文件
  



{dede:global.cfg_webname/}
{dede:global.cfg_basehost/}
{dede:global.cfg_description/}
zh-cn
{dede:global.cfg_webname/}
{dede:global.cfg_adminemail/}
{dede:arclist row=&#39;60′ col=&#39;1′ titlelen=&#39;100′ orderby=&#39;pubdate&#39;}

[field:arcurl/]

[field:writer/]
[field:typename/]
[field:pubdate function=&#39;strftime("%a, %d %b %Y %H:%M:%S +0800",@me)&#39;/]
[field:arcurl/]


{/dede:arclist}


  请注意,不要忘记将我的 URL 更改为您需要的内容。
  3、修改index.htm首页模板
  由于新浪微博只能验证网址,无法写出完整路径。比如我写的是:。结果表明关联失败。解决方法是在中间添加如下代码
  您可以通过以上方式成功关联新浪微博。
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持九云大使。

基于新浪微博API开发的微博系统Xweibov2.0正式发布

网站优化优采云 发表了文章 • 0 个评论 • 85 次浏览 • 2021-08-17 00:30 • 来自相关话题

  基于新浪微博API开发的微博系统Xweibov2.0正式发布
  站长之家()5月4日消息:基于新浪微博API开发的免费开源微博系统Xweibo v2.0beta正式发布。
  
  Xweibo v2.0beta拥有新浪微博的核心功能,拥有微博发布、浏览、转发、评论、私信、采集、话题、黑名单等核心功能,还满足更多的运营需求:本地数据备份、从头设置网站迷/关注关系或继续使用新浪微博的关注关系、多个互动模块(包括活动、直播、现场采访)、信息评论后台、自定义短链接、个性化域名名称、模板自由选择、自定义皮肤、异地调用功能(微博展示单元、用户列表单元、互动话题单元、一键关注单元、群微博单元)等
  通过X微博,您可以与网站合作,获得类似于新浪微博的微博系统。开发者可以根据开发文档,基于X微博提供的微博系统进行二次开发。是Xweibo产品的开发者。
  微博的火爆让很多网站表达了他们对微博营销的乐观态度。但是,微博怎么搭建,网站怎么运营,大家都很困惑。 X微博2.0的出现解决了这些困惑,为网站提供了强大的微博系统和运营管理后台,可以让网站在微博运营市场中独树一帜,将在互联网微博上使用。在浪潮中获得更大的发展机遇。
  X微博系统拥有目前微博流行的多种丰富功能,并提供强大的运营管理后台,为客户提供全新的运营体验,方便微博运营商灵活运营,为终端用户提供新的微博平台。让网站与用户通过微博形成全方位互动。
  微博特点:
  账号互通,畅游微博世界
  高效的运营管理平台
  完善的内容审核,保障信息安全
  1、数据本地备份。
  2、六层信息安全审查机制:
  多版本
  WAP不需要设置,直接读取WEB管理后台设置。
  更多服务:
  1、Xweibo 免费托管服务:免费配置,免费服务器,宽带,一键安装,即可拥有自己的微博系统。
  2、 免费申请托管服务域名绑定。点击查看
  微博下载
  Xweibo v2.0 正式版下载
  
  
  界面预览 查看全部

  基于新浪微博API开发的微博系统Xweibov2.0正式发布
  站长之家()5月4日消息:基于新浪微博API开发的免费开源微博系统Xweibo v2.0beta正式发布。
  
  Xweibo v2.0beta拥有新浪微博的核心功能,拥有微博发布、浏览、转发、评论、私信、采集、话题、黑名单等核心功能,还满足更多的运营需求:本地数据备份、从头设置网站迷/关注关系或继续使用新浪微博的关注关系、多个互动模块(包括活动、直播、现场采访)、信息评论后台、自定义短链接、个性化域名名称、模板自由选择、自定义皮肤、异地调用功能(微博展示单元、用户列表单元、互动话题单元、一键关注单元、群微博单元)等
  通过X微博,您可以与网站合作,获得类似于新浪微博的微博系统。开发者可以根据开发文档,基于X微博提供的微博系统进行二次开发。是Xweibo产品的开发者。
  微博的火爆让很多网站表达了他们对微博营销的乐观态度。但是,微博怎么搭建,网站怎么运营,大家都很困惑。 X微博2.0的出现解决了这些困惑,为网站提供了强大的微博系统和运营管理后台,可以让网站在微博运营市场中独树一帜,将在互联网微博上使用。在浪潮中获得更大的发展机遇。
  X微博系统拥有目前微博流行的多种丰富功能,并提供强大的运营管理后台,为客户提供全新的运营体验,方便微博运营商灵活运营,为终端用户提供新的微博平台。让网站与用户通过微博形成全方位互动。
  微博特点:
  账号互通,畅游微博世界
  高效的运营管理平台
  完善的内容审核,保障信息安全
  1、数据本地备份。
  2、六层信息安全审查机制:
  多版本
  WAP不需要设置,直接读取WEB管理后台设置。
  更多服务:
  1、Xweibo 免费托管服务:免费配置,免费服务器,宽带,一键安装,即可拥有自己的微博系统。
  2、 免费申请托管服务域名绑定。点击查看
  微博下载
  Xweibo v2.0 正式版下载
  
  
  界面预览

QQ登录腾讯开放平台,创建一个应用,获取APP_KEY

网站优化优采云 发表了文章 • 0 个评论 • 419 次浏览 • 2021-08-15 22:13 • 来自相关话题

  QQ登录腾讯开放平台,创建一个应用,获取APP_KEY
  一、登录
  1、登录腾讯开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  3、下载iOS SDK环境设置
  1、导入SDK,配置项目
  1、SDK下载到本地后,将SDK拖入项目
  
  2、添加需要的依赖库
  Security.framework
SystemConfiguration.framework
CoreGraphics.Framework
CoreTelephony.framework
libiconv.tdb
libsqlite3.tdb
libstdc++.tdb
libz.tdb
  3、在项目配置的“Build Settings”栏中找到“Linking”配置区,在“Other Linker Flags”配置项中添加属性值“-fobjc-arc”
  
  2、添加项目代码
  1、添加网址方案,新方案=腾讯+appid。
  
  2、在plist文件中设置ATS
  
  3、在plist文件中添加白名单
  LSApplicationQueriesSchemes
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
  添加后如下图:
  
  2、在 AppDelegate.m 中添加代码:
  #import "AppDelegate.h"
#import
#import
@interface AppDelegate ()
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
//设置应用需要用户授权的API列表
NSArray *_permissions = [NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil];
//调用SDK登录
[_tencentOAuth authorize:_permissions inSafari:NO];
[_tencentOAuth accessToken] ;
[_tencentOAuth openId] ;
return YES;
}
//登录成功
- (void)tencentDidLogin
{
NSLog(@"登录完成");
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]) {
// 记录登录用户的OpenID、Token以及过期时间
NSLog(@"%@",_tencentOAuth.accessToken);
} else {
NSLog(@"登录不成功 没有获取accesstoken");
}
}
//非网络错误导致登录失败
-(void)tencentDidNotLogin:(BOOL)cancelled
{
if (cancelled) {
NSLog(@"用户取消登录");
} else {
NSLog(@"登录失败");
}
}
//网络错误导致登录失败
-(void)tencentDidNotNetWork
{
NSLog(@"无网络连接,请设置网络");
}
// 处理来至QQ的请求
- (void)onReq:(QQBaseReq *)req{
NSLog(@" ----req %@",req);
}
//处理来至QQ的响应
- (void)onResp:(QQBaseResp *)resp{
NSLog(@" ----resp %@",resp);
}
//处理QQ在线状态的回调
- (void)isOnlineResponse:(NSDictionary *)response{
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [TencentOAuth HandleOpenURL:url];}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [TencentOAuth HandleOpenURL:url];
}
  效果图:
  
  3、错误处理
  我在集成中遇到配置错误,如下图:
  
  解决方法:我在QQ开放平台注册了一个应用,获得了APPID,但是没有提交审核。有可能是未审核的APPID不可用(大概),可以换一个腾讯提供的APPID:222222。
  
   //初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
  演示下载
  这是两个地方,如果你设置正确,就是这样。
  二、微信登录
  1、登录微信开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  1、导入SDK,配置项目
  1、将下载的SDK拖入项目
  2、添加依赖库
  SystemConfiguration.framework
libz.tdb
libsqlite3.0.tdb
libc++.tdb
Security.framework
CoreTelephony.framework
CFNetwork.framework
  如果一些依赖库已经存在,则无需重复添加。
  3、在您的项目文件中选择构建设置,并在“其他链接器标志”中添加“-Objc -all_load”
  
  4、在Xcode中,选择你的项目设置,选择“TARGETS”栏,在“info”选项卡的“URL type”中添加“URL scheme”作为你注册的应用id。
  
  2、添加相关代码
  1、在 AppDelegate.m 中导入头文件
  #import "WXApi.h"
  2、添加协议:
  WXApiDelegate
  3、注册微信SDK:
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WXApi registerApp:@"wxd477edab60670232"];
return YES;
}
  4、页面跳转处理
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
  如果项目中集成了多个第三方登录,需要判断。
  5、发送请求微信登录
  在需要调用微信登录的按钮方法中添加如下代码:
   SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact"; // @"post_timeline,sns"
req.state = @"xxx";
[WXApi sendAuthReq:req viewController:self delegate:nil];
  效果图
  
  演示下载
  三、新浪微博登录
  1、登录新浪微博开放平台,创建应用,获取APPID和APPKEY。
  2、下载对应的SDK
  1、导入SDK,配置项目
  1、下载SDK后,将SDK拖入项目
  
  2、 项目中引入静态库后,编译时需要添加-ObjC,在Target->Build Settings->Linking下的Other Linker Flags中添加-ObjC。 (如果已经添加了就不用再添加了)
  3、添加依赖库(如果已经添加了一些依赖库,则无需再次添加)
  QuartzCore.framework
ImageIO.framework
SystemConfiguration.framework
Security.framework
CoreTelephony.framework
CoreText.framework
UIKit.framework
Foundation.framework
CoreGraphics.framework
libz.tdb
libsqlite3.tdb
  4、添加 URL Schemes
  
  2、添加相关代码
  在 AppDelegate.m 中添加头文件
  #import "WeiboSDK.h"
  添加协议
  WeiboSDKDelegate
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WeiboSDK registerApp:@"2045436852"];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
return YES;
}
  在需要调用新浪微博登录的按钮方法中添加代码:
   WBMessageObject *message = [WBMessageObject message];
message.text = @"测试使用";
WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message];
[WeiboSDK sendRequest:request];
  新浪微博登录需要真机测试。
  演示下载 查看全部

  QQ登录腾讯开放平台,创建一个应用,获取APP_KEY
  一、登录
  1、登录腾讯开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  3、下载iOS SDK环境设置
  1、导入SDK,配置项目
  1、SDK下载到本地后,将SDK拖入项目
  
  2、添加需要的依赖库
  Security.framework
SystemConfiguration.framework
CoreGraphics.Framework
CoreTelephony.framework
libiconv.tdb
libsqlite3.tdb
libstdc++.tdb
libz.tdb
  3、在项目配置的“Build Settings”栏中找到“Linking”配置区,在“Other Linker Flags”配置项中添加属性值“-fobjc-arc”
  
  2、添加项目代码
  1、添加网址方案,新方案=腾讯+appid。
  
  2、在plist文件中设置ATS
  
  3、在plist文件中添加白名单
  LSApplicationQueriesSchemes
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
  添加后如下图:
  
  2、在 AppDelegate.m 中添加代码:
  #import "AppDelegate.h"
#import
#import
@interface AppDelegate ()
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
//设置应用需要用户授权的API列表
NSArray *_permissions = [NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil];
//调用SDK登录
[_tencentOAuth authorize:_permissions inSafari:NO];
[_tencentOAuth accessToken] ;
[_tencentOAuth openId] ;
return YES;
}
//登录成功
- (void)tencentDidLogin
{
NSLog(@"登录完成");
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]) {
// 记录登录用户的OpenID、Token以及过期时间
NSLog(@"%@",_tencentOAuth.accessToken);
} else {
NSLog(@"登录不成功 没有获取accesstoken");
}
}
//非网络错误导致登录失败
-(void)tencentDidNotLogin:(BOOL)cancelled
{
if (cancelled) {
NSLog(@"用户取消登录");
} else {
NSLog(@"登录失败");
}
}
//网络错误导致登录失败
-(void)tencentDidNotNetWork
{
NSLog(@"无网络连接,请设置网络");
}
// 处理来至QQ的请求
- (void)onReq:(QQBaseReq *)req{
NSLog(@" ----req %@",req);
}
//处理来至QQ的响应
- (void)onResp:(QQBaseResp *)resp{
NSLog(@" ----resp %@",resp);
}
//处理QQ在线状态的回调
- (void)isOnlineResponse:(NSDictionary *)response{
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [TencentOAuth HandleOpenURL:url];}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [TencentOAuth HandleOpenURL:url];
}
  效果图:
  
  3、错误处理
  我在集成中遇到配置错误,如下图:
  
  解决方法:我在QQ开放平台注册了一个应用,获得了APPID,但是没有提交审核。有可能是未审核的APPID不可用(大概),可以换一个腾讯提供的APPID:222222。
  
   //初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
  演示下载
  这是两个地方,如果你设置正确,就是这样。
  二、微信登录
  1、登录微信开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  1、导入SDK,配置项目
  1、将下载的SDK拖入项目
  2、添加依赖库
  SystemConfiguration.framework
libz.tdb
libsqlite3.0.tdb
libc++.tdb
Security.framework
CoreTelephony.framework
CFNetwork.framework
  如果一些依赖库已经存在,则无需重复添加。
  3、在您的项目文件中选择构建设置,并在“其他链接器标志”中添加“-Objc -all_load”
  
  4、在Xcode中,选择你的项目设置,选择“TARGETS”栏,在“info”选项卡的“URL type”中添加“URL scheme”作为你注册的应用id。
  
  2、添加相关代码
  1、在 AppDelegate.m 中导入头文件
  #import "WXApi.h"
  2、添加协议:
  WXApiDelegate
  3、注册微信SDK:
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WXApi registerApp:@"wxd477edab60670232"];
return YES;
}
  4、页面跳转处理
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
  如果项目中集成了多个第三方登录,需要判断。
  5、发送请求微信登录
  在需要调用微信登录的按钮方法中添加如下代码:
   SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact"; // @"post_timeline,sns"
req.state = @"xxx";
[WXApi sendAuthReq:req viewController:self delegate:nil];
  效果图
  
  演示下载
  三、新浪微博登录
  1、登录新浪微博开放平台,创建应用,获取APPID和APPKEY。
  2、下载对应的SDK
  1、导入SDK,配置项目
  1、下载SDK后,将SDK拖入项目
  
  2、 项目中引入静态库后,编译时需要添加-ObjC,在Target->Build Settings->Linking下的Other Linker Flags中添加-ObjC。 (如果已经添加了就不用再添加了)
  3、添加依赖库(如果已经添加了一些依赖库,则无需再次添加)
  QuartzCore.framework
ImageIO.framework
SystemConfiguration.framework
Security.framework
CoreTelephony.framework
CoreText.framework
UIKit.framework
Foundation.framework
CoreGraphics.framework
libz.tdb
libsqlite3.tdb
  4、添加 URL Schemes
  
  2、添加相关代码
  在 AppDelegate.m 中添加头文件
  #import "WeiboSDK.h"
  添加协议
  WeiboSDKDelegate
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WeiboSDK registerApp:@"2045436852"];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
return YES;
}
  在需要调用新浪微博登录的按钮方法中添加代码:
   WBMessageObject *message = [WBMessageObject message];
message.text = @"测试使用";
WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message];
[WeiboSDK sendRequest:request];
  新浪微博登录需要真机测试。
  演示下载

博客回复改版的事件、研究了新浪的web.api成功调用的新浪表情组件

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-08-15 22:09 • 来自相关话题

  博客回复改版的事件、研究了新浪的web.api成功调用的新浪表情组件
  最近在准备博客响应事件改版,研究了新浪的web.api调用成功的新浪表情组件
  来和大家分享一个很实用的东西,希望对大家有帮助
  我们先来看看操作的结果。
  
  是不是很刺眼?让我们来看看如何实现它。
  JS自定义hashtable代码如下
  //自定义hashtable
function Hashtable() {
this._hash = new Object();
this.put = function(key, value) {
if (typeof (key) != "undefined") {
if (this.containsKey(key) == false) {
this._hash[key] = typeof (value) == "undefined" ? null : value;
return true;
} else {
return false;
}
} else {
return false;
}
}
this.remove = function(key) { delete this._hash[key]; }
this.size =
function() { var i = 0; for (var k in this._hash) { i ; } return i; }
this.get = function(key) { return this._hash[key]; }
this.containsKey =
function(key) { return typeof (this._hash[key]) != "undefined"; }
this.clear =
function() { for (var k in this._hash) { delete this._hash[k]; } }
}
  初始化缓存并只加载一次页面。
  $(function() {
$.ajax( {
dataType : ´json´,
url : ´json/jquery.sinaEmotion.json´,
success : function(response) {
var data = response.data;
for ( var i in data) {
if (data[i].category == ´´) {
data[i].category = ´默认´;
}
if (emotions[data[i].category] == undefined) {
emotions[data[i].category] = new Array();
categorys.push(data[i].category);
}
emotions[data[i].category].push( {
name : data[i].phrase,
icon : data[i].icon
});
uSinaEmotionsHt.put(data[i].phrase, data[i].icon);
}
}
});
});
  替换
  function AnalyticEmotion(s) {
if(typeof (s) != "undefined") {
var sArr = s.match(/[.*?]/g);
for(var i = 0; i < sArr.length; i ){
if(uSinaEmotionsHt.containsKey(sArr[i])) {
var reStr = "";
s = s.replace(sArr[i], reStr);
}
}
}
return s;
}
  显示类别
  function showCategorys(){
var page = arguments[0]?arguments[0]:0;
if(page < 0 || page >= categorys.length / 5){
return;
}
$(´#emotions .categorys´).html(´´);
cat_page = page;
for(var i = page * 5; i < (page 1) * 5 && i < categorys.length; i){
$(´#emotions .categorys´)
.append($(´´
categorys[i] ´´));
}
$(´#emotions .categorys a´).click(function(){
showEmotions($(this).text());
});
$(´#emotions .categorys a´).each(function(){
if($(this).text() == cat_current){
$(this).addClass(´current´);
}
});
}
  显示表情
  function showEmotions(){
var category = arguments[0]?arguments[0]:´默认´;
var page = arguments[1]?arguments[1] - 1:0;
$(´#emotions .containersina´).html(´´);
$(´#emotions .page´).html(´´);
cat_current = category;
for(var i = page * 72; i < (page 1) * 72 && i < emotions[category].length; i){
$(´#emotions .containersina´)
.append($(´´
emotions[category][i].icon ´´));
}
$(´#emotions .containersina a´).click(function(){
target.insertText($(this).attr(´title´));
$(´#emotions´).remove();
});
for(var i = 1; i < emotions[category].length / 72 1; i){
$(´#emotions .page´).append($(´´ i ´´));
}
$(´#emotions .page a´).click(function(){
showEmotions(category, $(this).text());
});
$(´#emotions .categorys a.current´).removeClass(´current´);
$(´#emotions .categorys a´).each(function(){
if($(this).text() == category){
$(this).addClass(´current´);
}
});
}
  HTML代码如下
  
JQuery新浪1630个表情插件(带解析方法)
完美兼容IE6 所有浏览器


<br />


<br />
  当然要在整个代码实现之前引入对应的JS和CSS文件,对应的文件在源码中
  最后给大家一个源码下载链接:密码​​:6xe9
  也有本地版本:密码:6s3r
  如果资源对你有帮助,浏览后收获很多,不妨,你的鼓励是我继续写博客的最大动力 查看全部

  博客回复改版的事件、研究了新浪的web.api成功调用的新浪表情组件
  最近在准备博客响应事件改版,研究了新浪的web.api调用成功的新浪表情组件
  来和大家分享一个很实用的东西,希望对大家有帮助
  我们先来看看操作的结果。
  
  是不是很刺眼?让我们来看看如何实现它。
  JS自定义hashtable代码如下
  //自定义hashtable
function Hashtable() {
this._hash = new Object();
this.put = function(key, value) {
if (typeof (key) != "undefined") {
if (this.containsKey(key) == false) {
this._hash[key] = typeof (value) == "undefined" ? null : value;
return true;
} else {
return false;
}
} else {
return false;
}
}
this.remove = function(key) { delete this._hash[key]; }
this.size =
function() { var i = 0; for (var k in this._hash) { i ; } return i; }
this.get = function(key) { return this._hash[key]; }
this.containsKey =
function(key) { return typeof (this._hash[key]) != "undefined"; }
this.clear =
function() { for (var k in this._hash) { delete this._hash[k]; } }
}
  初始化缓存并只加载一次页面。
  $(function() {
$.ajax( {
dataType : ´json´,
url : ´json/jquery.sinaEmotion.json´,
success : function(response) {
var data = response.data;
for ( var i in data) {
if (data[i].category == ´´) {
data[i].category = ´默认´;
}
if (emotions[data[i].category] == undefined) {
emotions[data[i].category] = new Array();
categorys.push(data[i].category);
}
emotions[data[i].category].push( {
name : data[i].phrase,
icon : data[i].icon
});
uSinaEmotionsHt.put(data[i].phrase, data[i].icon);
}
}
});
});
  替换
  function AnalyticEmotion(s) {
if(typeof (s) != "undefined") {
var sArr = s.match(/[.*?]/g);
for(var i = 0; i < sArr.length; i ){
if(uSinaEmotionsHt.containsKey(sArr[i])) {
var reStr = "";
s = s.replace(sArr[i], reStr);
}
}
}
return s;
}
  显示类别
  function showCategorys(){
var page = arguments[0]?arguments[0]:0;
if(page < 0 || page >= categorys.length / 5){
return;
}
$(´#emotions .categorys´).html(´´);
cat_page = page;
for(var i = page * 5; i < (page 1) * 5 && i < categorys.length; i){
$(´#emotions .categorys´)
.append($(´´
categorys[i] ´´));
}
$(´#emotions .categorys a´).click(function(){
showEmotions($(this).text());
});
$(´#emotions .categorys a´).each(function(){
if($(this).text() == cat_current){
$(this).addClass(´current´);
}
});
}
  显示表情
  function showEmotions(){
var category = arguments[0]?arguments[0]:´默认´;
var page = arguments[1]?arguments[1] - 1:0;
$(´#emotions .containersina´).html(´´);
$(´#emotions .page´).html(´´);
cat_current = category;
for(var i = page * 72; i < (page 1) * 72 && i < emotions[category].length; i){
$(´#emotions .containersina´)
.append($(´´
emotions[category][i].icon ´´));
}
$(´#emotions .containersina a´).click(function(){
target.insertText($(this).attr(´title´));
$(´#emotions´).remove();
});
for(var i = 1; i < emotions[category].length / 72 1; i){
$(´#emotions .page´).append($(´´ i ´´));
}
$(´#emotions .page a´).click(function(){
showEmotions(category, $(this).text());
});
$(´#emotions .categorys a.current´).removeClass(´current´);
$(´#emotions .categorys a´).each(function(){
if($(this).text() == category){
$(this).addClass(´current´);
}
});
}
  HTML代码如下
  
JQuery新浪1630个表情插件(带解析方法)
完美兼容IE6 所有浏览器


<br />


<br />
  当然要在整个代码实现之前引入对应的JS和CSS文件,对应的文件在源码中
  最后给大家一个源码下载链接:密码​​:6xe9
  也有本地版本:密码:6s3r
  如果资源对你有帮助,浏览后收获很多,不妨,你的鼓励是我继续写博客的最大动力

网站调用新浪微博图片管理模块会匹配出api接口地址

网站优化优采云 发表了文章 • 0 个评论 • 93 次浏览 • 2021-08-08 18:08 • 来自相关话题

  网站调用新浪微博图片管理模块会匹配出api接口地址
  网站调用新浪微博内容时,“图片管理”模块会匹配出url,会匹配出api接口地址,并不是匹配不出来。新浪微博支持多点对齐,所以一个httppost请求里可能包含多张图片;而百度爬虫对图片抓取有一定准则,所以不会抓取多张图片,而是抓取同一段url。
  网站对于页面js代码是否会做限制,
  一个httppost请求包含多张图片的话,url会匹配多个url。
  百度会直接一个请求包含一张图片,但imageurl还是从url返回。
  因为js,css,javascript文件不都是在http协议下请求网站么
  大家说的都是原理,然后具体实现如何,我们就是做这个的。我刚进入这行的时候有说ajax和http基本不兼容,然后发现谷歌还真的就支持,不过mathml和一些css还是需要去适配。至于为什么,可能是浏览器无响应或者某种原因?不是ie原因的话,我就不知道了。我对google已经丧失好感了,换其他了吧,不需要这么做来吸引流量。
  有时候,其实也可以缓解google流量。如果你可以这么说,可能他每年的营业额还没有google一年营业额多。你可以想象一下效果。
  手机看不到,
  不是有发现文章是说,发布的图片一些默认的尺寸比较大,可能是开了网页的gzip压缩。 查看全部

  网站调用新浪微博图片管理模块会匹配出api接口地址
  网站调用新浪微博内容时,“图片管理”模块会匹配出url,会匹配出api接口地址,并不是匹配不出来。新浪微博支持多点对齐,所以一个httppost请求里可能包含多张图片;而百度爬虫对图片抓取有一定准则,所以不会抓取多张图片,而是抓取同一段url。
  网站对于页面js代码是否会做限制,
  一个httppost请求包含多张图片的话,url会匹配多个url。
  百度会直接一个请求包含一张图片,但imageurl还是从url返回。
  因为js,css,javascript文件不都是在http协议下请求网站么
  大家说的都是原理,然后具体实现如何,我们就是做这个的。我刚进入这行的时候有说ajax和http基本不兼容,然后发现谷歌还真的就支持,不过mathml和一些css还是需要去适配。至于为什么,可能是浏览器无响应或者某种原因?不是ie原因的话,我就不知道了。我对google已经丧失好感了,换其他了吧,不需要这么做来吸引流量。
  有时候,其实也可以缓解google流量。如果你可以这么说,可能他每年的营业额还没有google一年营业额多。你可以想象一下效果。
  手机看不到,
  不是有发现文章是说,发布的图片一些默认的尺寸比较大,可能是开了网页的gzip压缩。

如何实现博客内容打开搜狗搜索引擎?(默认打开)

网站优化优采云 发表了文章 • 0 个评论 • 125 次浏览 • 2021-07-30 00:12 • 来自相关话题

  如何实现博客内容打开搜狗搜索引擎?(默认打开)
  网站调用新浪微博内容/源码,然后微博内容上网站提交。将网站上新浪微博网页链接嵌入进搜狗搜索(默认打开)进行抓取。
  在我看来,这个问题不是“如何实现微博网页打开谷歌搜索引擎”而是“如何实现博客内容打开搜狗搜索引擎”两者是不一样的两种技术架构(搜狗好像在积极想做这个功能)应该是有两种不同的标准方案:1.restfulapi方案可以这么理解,在浏览器调用,然后谷歌搜索、最后发布到谷歌搜索。优点:便于实现定制化不需要服务器,content-type也比较简单缺点:有可能会不正规(如使用第三方编辑)这种方案出来的网站多为内容站,服务器需要认证,像不像谷歌的no-content,no-all的网站。
  这类网站做转发之类的功能应该会存在大问题。2.php高级技术,如响应式等。使用方案a,获取微博网页的源代码,发布到restfulapi,然后进行定制化构建方案b,我不知道采用何种方案,应该是使用开放api接口传递你的网站上的源代码,然后由谷歌搜索技术人员对你的网站进行定制化构建。到这一步,你网站的内容,已经是根据你的指定的内容来进行定制化了,有可能是博客,有可能是电商,然后谷歌搜索出来,会根据关键词进行匹配,如果匹配到你的电商网站或者你的博客网站,就会抓取下来你的网站。也有可能没有匹配到,或者你的博客网站被窃取了数据。 查看全部

  如何实现博客内容打开搜狗搜索引擎?(默认打开)
  网站调用新浪微博内容/源码,然后微博内容上网站提交。将网站上新浪微博网页链接嵌入进搜狗搜索(默认打开)进行抓取。
  在我看来,这个问题不是“如何实现微博网页打开谷歌搜索引擎”而是“如何实现博客内容打开搜狗搜索引擎”两者是不一样的两种技术架构(搜狗好像在积极想做这个功能)应该是有两种不同的标准方案:1.restfulapi方案可以这么理解,在浏览器调用,然后谷歌搜索、最后发布到谷歌搜索。优点:便于实现定制化不需要服务器,content-type也比较简单缺点:有可能会不正规(如使用第三方编辑)这种方案出来的网站多为内容站,服务器需要认证,像不像谷歌的no-content,no-all的网站。
  这类网站做转发之类的功能应该会存在大问题。2.php高级技术,如响应式等。使用方案a,获取微博网页的源代码,发布到restfulapi,然后进行定制化构建方案b,我不知道采用何种方案,应该是使用开放api接口传递你的网站上的源代码,然后由谷歌搜索技术人员对你的网站进行定制化构建。到这一步,你网站的内容,已经是根据你的指定的内容来进行定制化了,有可能是博客,有可能是电商,然后谷歌搜索出来,会根据关键词进行匹配,如果匹配到你的电商网站或者你的博客网站,就会抓取下来你的网站。也有可能没有匹配到,或者你的博客网站被窃取了数据。

使用python抓取一个人的所有信息_Python抓取新浪微博用户信息和内容

网站优化优采云 发表了文章 • 0 个评论 • 256 次浏览 • 2021-07-29 04:00 • 来自相关话题

  使用python抓取一个人的所有信息_Python抓取新浪微博用户信息和内容
  目标
  爬取新浪微博用户数据,包括以下字段:id、昵称、粉丝数、粉丝数、微博数、每条微博的内容、转发数、评论数、点赞数、发布时间、来源,无论是原创 还是转贴。 (本文以GUCCI为例)
  方法
  +使用 selenium 模拟爬虫
  +使用 BeautifulSoup 解析 HTML
  结果显示
  
  步骤分解
  1.选择抓取目标网址
  首先,在准备开始抓取之前,您必须弄清楚要抓取哪个网址。新浪微博网站分为网页版和手机版两种。大部分微博数据抓取都会选择抓取移动端,因为相比之下,移动端基本收录了你想要的所有数据,而移动端相对PC端轻量。
  以下是GUCCI手机端和PC端的网页展示。
  
  2.模拟登录
  设置好抓取微博手机数据后,就可以模拟登录了。
  模拟登录网址
  登陆页面的外观
  
  模拟登录代码
  
  
  3.获取用户微博页码
  登录后,您可以输入您要抓取的商家信息。因为每个商家的微博数量不同,对应的微博页码也不同。这里先抓取商家的微博页码。同时,爬取那些公开的信息,比如用户uid、用户名、微博数、关注数、粉丝数。
  
  4.根据最大爬取页数循环爬取所有数据
  得到最大页数后,直接通过循环抓取每一页数据。抓取到的数据包括微博内容、转发数、评论数、点赞数、发微博时间、微博来源,以及是原创还是转发。
  
  
  4.得到所有数据后,可以写入csv文件或者excel,最终结果会显示在上面
  文章来解决完整的微博爬虫!
  最后想一起学python和爬虫的可以来我的python学习裙【784758214】,里面有安装
  包和学习视频资料免费分享,朋友在里面交流,每天分享一些学习方法和需要注意的小细节
  我也会按时讲一些实际的项目案例。
  点击:加入 查看全部

  使用python抓取一个人的所有信息_Python抓取新浪微博用户信息和内容
  目标
  爬取新浪微博用户数据,包括以下字段:id、昵称、粉丝数、粉丝数、微博数、每条微博的内容、转发数、评论数、点赞数、发布时间、来源,无论是原创 还是转贴。 (本文以GUCCI为例)
  方法
  +使用 selenium 模拟爬虫
  +使用 BeautifulSoup 解析 HTML
  结果显示
  
  步骤分解
  1.选择抓取目标网址
  首先,在准备开始抓取之前,您必须弄清楚要抓取哪个网址。新浪微博网站分为网页版和手机版两种。大部分微博数据抓取都会选择抓取移动端,因为相比之下,移动端基本收录了你想要的所有数据,而移动端相对PC端轻量。
  以下是GUCCI手机端和PC端的网页展示。
  
  2.模拟登录
  设置好抓取微博手机数据后,就可以模拟登录了。
  模拟登录网址
  登陆页面的外观
  
  模拟登录代码
  
  
  3.获取用户微博页码
  登录后,您可以输入您要抓取的商家信息。因为每个商家的微博数量不同,对应的微博页码也不同。这里先抓取商家的微博页码。同时,爬取那些公开的信息,比如用户uid、用户名、微博数、关注数、粉丝数。
  
  4.根据最大爬取页数循环爬取所有数据
  得到最大页数后,直接通过循环抓取每一页数据。抓取到的数据包括微博内容、转发数、评论数、点赞数、发微博时间、微博来源,以及是原创还是转发。
  
  
  4.得到所有数据后,可以写入csv文件或者excel,最终结果会显示在上面
  文章来解决完整的微博爬虫!
  最后想一起学python和爬虫的可以来我的python学习裙【784758214】,里面有安装
  包和学习视频资料免费分享,朋友在里面交流,每天分享一些学习方法和需要注意的小细节
  我也会按时讲一些实际的项目案例。
  点击:加入

使用Selenium爬取动态网页为例-新浪微博网站解析

网站优化优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2021-07-24 02:01 • 来自相关话题

  使用Selenium爬取动态网页为例-新浪微博网站解析
  今天我们将使用Selenium来抓取动态网页,以新浪微博网站为例。我们需要通过以下三个步骤进行抓取:
  登录新浪微博网站分析微博网站页面定期重新打开微博首页,抓取最新微博或拉动滚动条抓取更多以前的微博
  代码如下
  # -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date: 2019-09-24 16:20
# # @Last Modified by: lemon
# # @Last Modified time: 2019-09-24 19:12
# # @function: 爬取新浪微博网站
from selenium import webdriver
import time
import pandas as pd
import hashlib # 摘要算法(哈希算法)包
# 创建 data 用来存储
def create_frame():
data = {
&#39;用户_id&#39;: [],
&#39;用户_url&#39;: [],
&#39;微博内容&#39;: []
}
return data
# 写入data
def data_writer(pub_id, pub_url, pub_content):
data[&#39;用户_id&#39;].append(pub_id)
data[&#39;用户_url&#39;].append(pub_url)
data[&#39;微博内容&#39;].append(pub_content)
# 保存文件
def data_save():
frame = pd.DataFrame(data)
frame.to_excel(&#39;微博用户数据.xlsx&#39;)
# 登录微博
def login():
driver.get(&#39;https://weibo.com&#39;)
time.sleep(5)
driver.set_window_size(1920, 1080) # 设置浏览器大小
username = driver.find_element_by_xpath(&#39;//*[@id="loginname"]&#39;) # 用户名输入框
username.send_keys(&#39;lemon_of_sun@sina.com&#39;) # 发送账号
password = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input&#39;) # 密码输入框
password.send_keys(&#39;sunxusen2020&#39;) # 发送密码
submit = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[6]&#39;) # 登录按钮
print(&#39;准备登录...&#39;)
submit.click() # 点击登录按钮
time.sleep(4) # 停止 4s , 确保已成功切入后续页面
# 抓取页面
def spider():
driver.get(&#39;https://www.weibo.com&#39;) # 刷新微博网站首页
print(&#39;已登录...&#39;)
# 先获取页面中所有微博代码段, 然后使用循环从每一段中提取数据
all_weibo = driver.find_elements_by_xpath(&#39;//*[@class="WB_feed_detail clearfix"]&#39;)
for weibo in all_weibo:
pub_id = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].text # 解析出微博用户 id
pub_url = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].get_attribute(&#39;href&#39;) # 解析出发布者 URL
try:
pub_content = weibo.find_elements_by_xpath(&#39;div[3]/div[4]&#39;)[0].text
except:
print(f&#39;{pub_id} : 无内容&#39;)
pub_content = &#39;无内容&#39;
pass
hash_content = hashlib.md5(pub_content.encode(&#39;utf-8&#39;)).hexdigest() # 计算微博内容的 MD5 值
if hash_content not in is_dup:
print(f&#39;成功抓取 : {pub_id}&#39;)
data_writer(pub_id, pub_url, pub_content)
is_dup.add(hash_content)
if __name__ == &#39;__main__&#39;:
is_dup = set() # 创建一个空的 set, 用来去重
data = create_frame()
driver = webdriver.Chrome(&#39;E:\ChromeDriver\chromedriver.exe&#39;)
login()
for i in range(3):
spider()
time.sleep(10)
data_save()
  上述代码中使用了重复数据删除功能。在爬取的过程中,我们可能会爬取之前已经爬取过的数据。这时候我们就需要进行去重。我们使用最常见的集合数据结构进行重复数据删除。我们使用微博内容进行去重判断,可以直接将抓取到的内容加入集合中。不过因为一般微博内容比较多,直接使用会占用大量内存,影响爬虫效率。下面我们使用摘要算法(也称为哈希算法),它通过一个函数将任意长度的数据转换为固定长度的数据串。微博内容是一个很长的字符串。使用摘要算法将得到一个固定长度的摘要。如果一段时间后再次爬取这条微博,使用digest算法得到相同的digest;如果再次抓取微博的内容发生了变化,计算出来的摘要会与原微博的摘要不同。
  下面以最常见的MD5摘要算法为例,计算一个字符串的MD5值。这里需要导入hashlib。 Hashlib 是一个 Python 标准库,提供了一些流行的哈希算法。有兴趣的朋友可以研究一下。
  def MD5_example():
str_md5 = hashlib.md5(&#39;life is short you need python&#39;.encode(&#39;utf-8&#39;)).hexdigest()
print(str_md5)
  输出如下:
  
  注意:在使用MD5算法计算摘要之前,需要将字符串编码成二进制形式。 查看全部

  使用Selenium爬取动态网页为例-新浪微博网站解析
  今天我们将使用Selenium来抓取动态网页,以新浪微博网站为例。我们需要通过以下三个步骤进行抓取:
  登录新浪微博网站分析微博网站页面定期重新打开微博首页,抓取最新微博或拉动滚动条抓取更多以前的微博
  代码如下
  # -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date: 2019-09-24 16:20
# # @Last Modified by: lemon
# # @Last Modified time: 2019-09-24 19:12
# # @function: 爬取新浪微博网站
from selenium import webdriver
import time
import pandas as pd
import hashlib # 摘要算法(哈希算法)包
# 创建 data 用来存储
def create_frame():
data = {
&#39;用户_id&#39;: [],
&#39;用户_url&#39;: [],
&#39;微博内容&#39;: []
}
return data
# 写入data
def data_writer(pub_id, pub_url, pub_content):
data[&#39;用户_id&#39;].append(pub_id)
data[&#39;用户_url&#39;].append(pub_url)
data[&#39;微博内容&#39;].append(pub_content)
# 保存文件
def data_save():
frame = pd.DataFrame(data)
frame.to_excel(&#39;微博用户数据.xlsx&#39;)
# 登录微博
def login():
driver.get(&#39;https://weibo.com&#39;)
time.sleep(5)
driver.set_window_size(1920, 1080) # 设置浏览器大小
username = driver.find_element_by_xpath(&#39;//*[@id="loginname"]&#39;) # 用户名输入框
username.send_keys(&#39;lemon_of_sun@sina.com&#39;) # 发送账号
password = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input&#39;) # 密码输入框
password.send_keys(&#39;sunxusen2020&#39;) # 发送密码
submit = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[6]&#39;) # 登录按钮
print(&#39;准备登录...&#39;)
submit.click() # 点击登录按钮
time.sleep(4) # 停止 4s , 确保已成功切入后续页面
# 抓取页面
def spider():
driver.get(&#39;https://www.weibo.com&#39;) # 刷新微博网站首页
print(&#39;已登录...&#39;)
# 先获取页面中所有微博代码段, 然后使用循环从每一段中提取数据
all_weibo = driver.find_elements_by_xpath(&#39;//*[@class="WB_feed_detail clearfix"]&#39;)
for weibo in all_weibo:
pub_id = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].text # 解析出微博用户 id
pub_url = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].get_attribute(&#39;href&#39;) # 解析出发布者 URL
try:
pub_content = weibo.find_elements_by_xpath(&#39;div[3]/div[4]&#39;)[0].text
except:
print(f&#39;{pub_id} : 无内容&#39;)
pub_content = &#39;无内容&#39;
pass
hash_content = hashlib.md5(pub_content.encode(&#39;utf-8&#39;)).hexdigest() # 计算微博内容的 MD5 值
if hash_content not in is_dup:
print(f&#39;成功抓取 : {pub_id}&#39;)
data_writer(pub_id, pub_url, pub_content)
is_dup.add(hash_content)
if __name__ == &#39;__main__&#39;:
is_dup = set() # 创建一个空的 set, 用来去重
data = create_frame()
driver = webdriver.Chrome(&#39;E:\ChromeDriver\chromedriver.exe&#39;)
login()
for i in range(3):
spider()
time.sleep(10)
data_save()
  上述代码中使用了重复数据删除功能。在爬取的过程中,我们可能会爬取之前已经爬取过的数据。这时候我们就需要进行去重。我们使用最常见的集合数据结构进行重复数据删除。我们使用微博内容进行去重判断,可以直接将抓取到的内容加入集合中。不过因为一般微博内容比较多,直接使用会占用大量内存,影响爬虫效率。下面我们使用摘要算法(也称为哈希算法),它通过一个函数将任意长度的数据转换为固定长度的数据串。微博内容是一个很长的字符串。使用摘要算法将得到一个固定长度的摘要。如果一段时间后再次爬取这条微博,使用digest算法得到相同的digest;如果再次抓取微博的内容发生了变化,计算出来的摘要会与原微博的摘要不同。
  下面以最常见的MD5摘要算法为例,计算一个字符串的MD5值。这里需要导入hashlib。 Hashlib 是一个 Python 标准库,提供了一些流行的哈希算法。有兴趣的朋友可以研究一下。
  def MD5_example():
str_md5 = hashlib.md5(&#39;life is short you need python&#39;.encode(&#39;utf-8&#39;)).hexdigest()
print(str_md5)
  输出如下:
  
  注意:在使用MD5算法计算摘要之前,需要将字符串编码成二进制形式。

链接源头文字的写作需要和指向页的内容相关性

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-07-15 23:59 • 来自相关话题

  链接源头文字的写作需要和指向页的内容相关性
  亚历克斯
  Alexa是亚马逊公司下属的网站,用于估算网站在全球各个国家的总流量,以确定网站的受欢迎程度。它给网站 一个统一的排名。 Alexa值越小,排名越高,网站的流量越大。但是,这些数据只能作为参考。由于是第三方估算,无法直接获取流量数据,且其给出的流量数据并没有以Alexa工具栏的用户为依据,给出的流量数据相当夸张或压缩,因此没有真正的测量。 网站 性能特点。 网站 的实际表现取决于网站 自己独立的统计系统的数据,Alexa 无法使用这些数据。 Alexa数据对搜索引擎优化没有参考价值。
  算法算法
  算法是为解决问题而形成的公式。在搜索引擎中,算法是程序员编写的一套程序,用于自动分析网站的内容、结构和相关性,以确定网站的质量和价值,并为关键词的排名提供依据搜索结果。
  锚文本链接源文本
  链接的源文本是网页中由一行突出显示的一段文本,用于指示指向另一个网页的链接的描述。点击此文字,浏览器会调出此文字后的目标,即另一个网页。链接源文本的编写需要与指向页面的内容相关联,以便访问者能够简洁明了地介绍指向页面。链接源文本的编写对提升网站PR的价值有重要作用 查看全部

  链接源头文字的写作需要和指向页的内容相关性
  亚历克斯
  Alexa是亚马逊公司下属的网站,用于估算网站在全球各个国家的总流量,以确定网站的受欢迎程度。它给网站 一个统一的排名。 Alexa值越小,排名越高,网站的流量越大。但是,这些数据只能作为参考。由于是第三方估算,无法直接获取流量数据,且其给出的流量数据并没有以Alexa工具栏的用户为依据,给出的流量数据相当夸张或压缩,因此没有真正的测量。 网站 性能特点。 网站 的实际表现取决于网站 自己独立的统计系统的数据,Alexa 无法使用这些数据。 Alexa数据对搜索引擎优化没有参考价值。
  算法算法
  算法是为解决问题而形成的公式。在搜索引擎中,算法是程序员编写的一套程序,用于自动分析网站的内容、结构和相关性,以确定网站的质量和价值,并为关键词的排名提供依据搜索结果。
  锚文本链接源文本
  链接的源文本是网页中由一行突出显示的一段文本,用于指示指向另一个网页的链接的描述。点击此文字,浏览器会调出此文字后的目标,即另一个网页。链接源文本的编写需要与指向页面的内容相关联,以便访问者能够简洁明了地介绍指向页面。链接源文本的编写对提升网站PR的价值有重要作用

代码去爬去新浪微博的登陆操作心得(二)

网站优化优采云 发表了文章 • 0 个评论 • 96 次浏览 • 2021-07-15 23:49 • 来自相关话题

  代码去爬去新浪微博的登陆操作心得(二)
  概述:
  由于业务需要,需要编写爬虫代码来爬取新浪微博用户的信息。
  虽然网上可以查到很多资料,但由于新浪微博的改版和登录机制的修改,很多老的文章不适合使用。
  经过一番摸索,成功模拟了新浪微博的登录操作。该项目使用 Javascript 语言并在 Chrome 扩展程序中运行。和大家分享一下过程和经验。
  请注意,这篇文章是在 2013.08.16 写的。由于微博业务变化频繁,随着时间的推移,文章可能不再适用。
  正文:探索的过程
  1.了解大致流程
  登录微博,使用fiddler工具监听http请求,拦截如下操作:
  
  可以看到,在整个微博登录过程中,有四个重要的HTTP请求,分别是:
  (1) GET /sso/prelogin.php
  (2) POST /sso/login.php
  (3) GET /ajaxlogin.php
  (4) GET /u/2813262187
  其中,sso是单点登录
  (1)是登录前的预处理,名字很明显--pre。这一步主要是获取几个重要的参数,作为下一个POST表单的参数。
  可以在浏览器中访问请求地址查看返回结果:
  (v1.4.11)
  结果如下:
  1sinaSSOController.preloginCallBack({"retcode":0,
  2"servertime":1376533839,
  3"pcid":"gz-7bdd82b8980057a8bbc1f86b21d5a86184dd",
  4"nonce":"R1KGHZ",
  5 “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”,
  6"rsakv":"1330428213",
  7"exectime":2})
  返回的数据包括servertime:服务时间戳,nonce:6位随机码,pubkey:用于rsa2密码加密的公钥,rsakv:显然也用于加密。
  这四个值都是下一步需要用到的。
  在长版的新浪微博登录机制中,使用的是sha加密方式,没有pubkey和rsakv参数,
  所以网上看到的2012年爬虫代码模拟登录的代码已经不适合使用了,但是整体逻辑变化不大。只需稍加修改即可使用。我就是这样来到这里的。 , 撞墙无数=.=
  给两个参考文章:
  对于 Python
  对于 PHP
  (2)提交表单的操作,我们还是检查HTTP请求和表单内容
  
  我看到了,servertime、nonce、rsakv 和 su:加密的用户名,sp:加密的密码。现在的问题是用户名和密码是如何加密的,这样我们就可以轻松关注js代码了
  请求新浪登录页面:有密码加密的js代码,
  里面的代码是加密的。找个工具解密(),基本看不到里面的逻辑。
  (3)解析ssologin.js
  既然知道servertime和nonce是用来加密的,那我们不妨在文件中搜索这两个关键字,一搜发现好东西:
  
  回到上面看看,form里面有su和sp,都在这里,可以看到su使用了base64加密;而 su 有点复杂,
  if中的代码是新浪当前版本的密码加密方式rsa2的代码,else中的代码是版本sha加密的代码,我们只需要关心if中的内容,
  加密过程很简单,先生成一个RSAKey对象,设置PublicKey,然后加密。
  一一推回去,就可以知道最后一步加密的最后一个参数ag就是原来的密码值了,就不会眼花缭乱了~
  总而言之,以pubkey和10001的长字符串为参数调用setPublic()。注意它们都是十六进制数;然后使用 (servertime + nonce + pwd) 作为参数调用 Encrypt()。 .
  我们来看看sinaSSOEncoder是什么。它的定义在解密代码的第 1118 行。从这里开始,我们将截取到文件的末尾,我们自己使用。
  1}).call(sinaSSOEncoder);
  2//sinaSSOController=newSSOController();
  3//sinaSSOController.init();
  这样就解决了密码加密的问题。
  2. 模拟请求过程
  既然知道了大体原理,就可以开始模拟整个登录过程了,
  (1) GET 请求(v1.4.11)
  在返回的数据中,servertime、nonce和rsakv是有规律匹配的。请注意,请求时也必须将时间戳发送到服务器。我们来看看fiddler监听的QueryString:
  
  前五个参数都是在URL中显示和声明的,最后一个_是在发送请求的时候加上并传递过来的。
  我正在使用Javascript,使用Jquery,只需将其添加到$.ajax 中的数据属性即可。
  (2)POST 请求(v1.4.11)提交登录表单
  1 个代理('(v1.4.11)',
  2{type:'POST',headers:{Referer:'#39;},
  3 数据:{
  4entry:'微博',
  5gateway:1,
  6from:'',
  7savestate:7,
  8useticket:1,
  9pagerefer:'#39;,
  10vsnf:1,
  11 su:'MTgxMDU0MjMzNyU0MHFxLmNvbQ==',
  12service:'miniblog',
  13 服务器时间:服务器时间,
  14 nonce:nonce,
  15pwencode:'rsa2',
  16 rsakv:rsakv,
  17 sp:sp,
  18encoding:'UTF-8',
  19prelt:505,
  20url:'#39;,
  21returntype:'META'
  22}
  23}, function(err,data){ ...});
  Agent 是一个封装模块,用于发送请求事务。重点看里面的数据对象,其中su是base64加密的用户名,每次调用都是固定的,所以这里不好写;
  servertime、nonce、rsakv都是上一步截取的;
  sp是加密后的密码,可以参考上面的加密方法获得。 查看全部

  代码去爬去新浪微博的登陆操作心得(二)
  概述:
  由于业务需要,需要编写爬虫代码来爬取新浪微博用户的信息。
  虽然网上可以查到很多资料,但由于新浪微博的改版和登录机制的修改,很多老的文章不适合使用。
  经过一番摸索,成功模拟了新浪微博的登录操作。该项目使用 Javascript 语言并在 Chrome 扩展程序中运行。和大家分享一下过程和经验。
  请注意,这篇文章是在 2013.08.16 写的。由于微博业务变化频繁,随着时间的推移,文章可能不再适用。
  正文:探索的过程
  1.了解大致流程
  登录微博,使用fiddler工具监听http请求,拦截如下操作:
  
  可以看到,在整个微博登录过程中,有四个重要的HTTP请求,分别是:
  (1) GET /sso/prelogin.php
  (2) POST /sso/login.php
  (3) GET /ajaxlogin.php
  (4) GET /u/2813262187
  其中,sso是单点登录
  (1)是登录前的预处理,名字很明显--pre。这一步主要是获取几个重要的参数,作为下一个POST表单的参数。
  可以在浏览器中访问请求地址查看返回结果:
  (v1.4.11)
  结果如下:
  1sinaSSOController.preloginCallBack({"retcode":0,
  2"servertime":1376533839,
  3"pcid":"gz-7bdd82b8980057a8bbc1f86b21d5a86184dd",
  4"nonce":"R1KGHZ",
  5 “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”,
  6"rsakv":"1330428213",
  7"exectime":2})
  返回的数据包括servertime:服务时间戳,nonce:6位随机码,pubkey:用于rsa2密码加密的公钥,rsakv:显然也用于加密。
  这四个值都是下一步需要用到的。
  在长版的新浪微博登录机制中,使用的是sha加密方式,没有pubkey和rsakv参数,
  所以网上看到的2012年爬虫代码模拟登录的代码已经不适合使用了,但是整体逻辑变化不大。只需稍加修改即可使用。我就是这样来到这里的。 , 撞墙无数=.=
  给两个参考文章:
  对于 Python
  对于 PHP
  (2)提交表单的操作,我们还是检查HTTP请求和表单内容
  
  我看到了,servertime、nonce、rsakv 和 su:加密的用户名,sp:加密的密码。现在的问题是用户名和密码是如何加密的,这样我们就可以轻松关注js代码了
  请求新浪登录页面:有密码加密的js代码,
  里面的代码是加密的。找个工具解密(),基本看不到里面的逻辑。
  (3)解析ssologin.js
  既然知道servertime和nonce是用来加密的,那我们不妨在文件中搜索这两个关键字,一搜发现好东西:
  
  回到上面看看,form里面有su和sp,都在这里,可以看到su使用了base64加密;而 su 有点复杂,
  if中的代码是新浪当前版本的密码加密方式rsa2的代码,else中的代码是版本sha加密的代码,我们只需要关心if中的内容,
  加密过程很简单,先生成一个RSAKey对象,设置PublicKey,然后加密。
  一一推回去,就可以知道最后一步加密的最后一个参数ag就是原来的密码值了,就不会眼花缭乱了~
  总而言之,以pubkey和10001的长字符串为参数调用setPublic()。注意它们都是十六进制数;然后使用 (servertime + nonce + pwd) 作为参数调用 Encrypt()。 .
  我们来看看sinaSSOEncoder是什么。它的定义在解密代码的第 1118 行。从这里开始,我们将截取到文件的末尾,我们自己使用。
  1}).call(sinaSSOEncoder);
  2//sinaSSOController=newSSOController();
  3//sinaSSOController.init();
  这样就解决了密码加密的问题。
  2. 模拟请求过程
  既然知道了大体原理,就可以开始模拟整个登录过程了,
  (1) GET 请求(v1.4.11)
  在返回的数据中,servertime、nonce和rsakv是有规律匹配的。请注意,请求时也必须将时间戳发送到服务器。我们来看看fiddler监听的QueryString:
  
  前五个参数都是在URL中显示和声明的,最后一个_是在发送请求的时候加上并传递过来的。
  我正在使用Javascript,使用Jquery,只需将其添加到$.ajax 中的数据属性即可。
  (2)POST 请求(v1.4.11)提交登录表单
  1 个代理('(v1.4.11)',
  2{type:'POST',headers:{Referer:'#39;},
  3 数据:{
  4entry:'微博',
  5gateway:1,
  6from:'',
  7savestate:7,
  8useticket:1,
  9pagerefer:'#39;,
  10vsnf:1,
  11 su:'MTgxMDU0MjMzNyU0MHFxLmNvbQ==',
  12service:'miniblog',
  13 服务器时间:服务器时间,
  14 nonce:nonce,
  15pwencode:'rsa2',
  16 rsakv:rsakv,
  17 sp:sp,
  18encoding:'UTF-8',
  19prelt:505,
  20url:'#39;,
  21returntype:'META'
  22}
  23}, function(err,data){ ...});
  Agent 是一个封装模块,用于发送请求事务。重点看里面的数据对象,其中su是base64加密的用户名,每次调用都是固定的,所以这里不好写;
  servertime、nonce、rsakv都是上一步截取的;
  sp是加密后的密码,可以参考上面的加密方法获得。

网站调用新浪微博内容(试试用python调用微博API的方法微博接口 )

网站优化优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2021-09-05 07:14 • 来自相关话题

  网站调用新浪微博内容(试试用python调用微博API的方法微博接口
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写这个地址可以代替,我试了一下,果然成功,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  
import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
ppre class="brush:py;"
api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=REDIRECT_URL)
authorize_url = api.get_authorize_url()
print(authorize_url)
webbrowser.open_new(authorize_url)
/pre/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281542525.gif?2014628154319' alt=''//p
p登录后会转成一个连接/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
ppre class="brush:py;"
request = api.request_access_token(code, REDIRECT_URL)
access_token = request.access_token
expires_in = request.expires_in
api.set_access_token(access_token, expires_in)
api.statuses.update.post(status=u'Test OAuth 2.0 Send a Weibo!')/pre/p
paccess_token是获取到的token,expires_in是授权过期时间(UNIX时间)/p
p使用 set_access_token 保存授权。然后就可以调用微博界面了。测试发了一条微博/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281544056.gif?2014628154419' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
ppre class="brush:py;"
accessWeibo
# -*- coding: utf-8 -*-
#/usr/bin/env python
#access to SinaWeibo By sinaweibopy
#实现微博自动登录,token自动生成,保存及更新
#适合于后端服务调用
from weibo import APIClient
import pymongo
import sys, os, urllib, urllib2
from http_helper import *
from retry import *
try:
import json
except ImportError:
import simplejson as json
# setting sys encoding to utf-8
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
# weibo api访问配置
APP_KEY = '' # app key
APP_SECRET = '' # app secret
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致
USERID = '' # 登陆的微博用户名,必须是OAuth2.0 设置的测试账号
USERPASSWD = '' # 用户密码
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)
def make_access_token():
#请求access token
params = urllib.urlencode({
'action':'submit',
'withOfficalFlag':'0',
'ticket':'',
'isLoginSina':'',
'response_type':'code',
'regCallback':'',
'redirect_uri':REDIRECT_URL,
'client_id':APP_KEY,
'state':'',
'from':'',
'userId':USERID,
'passwd':USERPASSWD,
})
login_url = 'https://api.weibo.com/oauth2/authorize'
url = client.get_authorize_url()
content = urllib2.urlopen(url)
if content:
headers = { 'Referer' : url }
request = urllib2.Request(login_url, params, headers)
opener = get_opener(False)
urllib2.install_opener(opener)
try:
f = opener.open(request)
return_redirect_uri = f.url
except urllib2.HTTPError, e:
return_redirect_uri = e.geturl()
# 取到返回的code
code = return_redirect_uri.split('=')[1]
#得到token
token = client.request_access_token(code,REDIRECT_URL)
save_access_token(token)
def save_access_token(token):
#将access token保存到MongoDB数据库
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
t={
"access_token":token['access_token'],
"expires_in":str(token['expires_in']),
"date":time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
}
db.token.insert(t,safe=True)
#Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()
@retry(1)
def apply_access_token():
#从MongoDB读取及设置access token
try:
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
if db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]
try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False
return True
if __name__ == "__main__":
apply_access_token()
# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
retry.py
import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.
delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
http_helper.py
# -*- coding: utf-8 -*-
#/usr/bin/env python
import urllib2,cookielib
class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def http_error_302(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_302(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def get_cookie():
cookies = cookielib.CookieJar()
return urllib2.HTTPCookieProcessor(cookies)
def get_opener(proxy=False):
rv=urllib2.build_opener(get_cookie(), SmartRedirectHandler())
rv.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)')]
return rv 查看全部

  网站调用新浪微博内容(试试用python调用微博API的方法微博接口
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写这个地址可以代替,我试了一下,果然成功,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  
import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
ppre class="brush:py;"
api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=REDIRECT_URL)
authorize_url = api.get_authorize_url()
print(authorize_url)
webbrowser.open_new(authorize_url)
/pre/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281542525.gif?2014628154319' alt=''//p
p登录后会转成一个连接/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
ppre class="brush:py;"
request = api.request_access_token(code, REDIRECT_URL)
access_token = request.access_token
expires_in = request.expires_in
api.set_access_token(access_token, expires_in)
api.statuses.update.post(status=u'Test OAuth 2.0 Send a Weibo!')/pre/p
paccess_token是获取到的token,expires_in是授权过期时间(UNIX时间)/p
p使用 set_access_token 保存授权。然后就可以调用微博界面了。测试发了一条微博/p
pimg src='https://img.jbzj.com/file_images/article/201407/201407281544056.gif?2014628154419' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
ppre class="brush:py;"
accessWeibo
# -*- coding: utf-8 -*-
#/usr/bin/env python
#access to SinaWeibo By sinaweibopy
#实现微博自动登录,token自动生成,保存及更新
#适合于后端服务调用
from weibo import APIClient
import pymongo
import sys, os, urllib, urllib2
from http_helper import *
from retry import *
try:
import json
except ImportError:
import simplejson as json
# setting sys encoding to utf-8
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
# weibo api访问配置
APP_KEY = '' # app key
APP_SECRET = '' # app secret
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致
USERID = '' # 登陆的微博用户名,必须是OAuth2.0 设置的测试账号
USERPASSWD = '' # 用户密码
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)
def make_access_token():
#请求access token
params = urllib.urlencode({
'action':'submit',
'withOfficalFlag':'0',
'ticket':'',
'isLoginSina':'',
'response_type':'code',
'regCallback':'',
'redirect_uri':REDIRECT_URL,
'client_id':APP_KEY,
'state':'',
'from':'',
'userId':USERID,
'passwd':USERPASSWD,
})
login_url = 'https://api.weibo.com/oauth2/authorize'
url = client.get_authorize_url()
content = urllib2.urlopen(url)
if content:
headers = { 'Referer' : url }
request = urllib2.Request(login_url, params, headers)
opener = get_opener(False)
urllib2.install_opener(opener)
try:
f = opener.open(request)
return_redirect_uri = f.url
except urllib2.HTTPError, e:
return_redirect_uri = e.geturl()
# 取到返回的code
code = return_redirect_uri.split('=')[1]
#得到token
token = client.request_access_token(code,REDIRECT_URL)
save_access_token(token)
def save_access_token(token):
#将access token保存到MongoDB数据库
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
t={
"access_token":token['access_token'],
"expires_in":str(token['expires_in']),
"date":time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
}
db.token.insert(t,safe=True)
#Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()
@retry(1)
def apply_access_token():
#从MongoDB读取及设置access token
try:
mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)
db= mongoCon.weibo
if db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]
try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False
return True
if __name__ == "__main__":
apply_access_token()
# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
retry.py
import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.
delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
http_helper.py
# -*- coding: utf-8 -*-
#/usr/bin/env python
import urllib2,cookielib
class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def http_error_302(cls, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_302(cls, req, fp, code, msg, headers)
result.status = code
print headers
return result
def get_cookie():
cookies = cookielib.CookieJar()
return urllib2.HTTPCookieProcessor(cookies)
def get_opener(proxy=False):
rv=urllib2.build_opener(get_cookie(), SmartRedirectHandler())
rv.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)')]
return rv

网站调用新浪微博内容(wordpress网站可以写php代码1.php文件测试.php)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-09-05 07:11 • 来自相关话题

  网站调用新浪微博内容(wordpress网站可以写php代码1.php文件测试.php)
  据说wordpress网站发帖时可以将文章同步到新浪微博,我想根据同样的方法写一个php代码测试。以下引用自:
  微博同步有插件、关联博客、非插件微博界面三种方式
  第一种是直接在百度上搜索;
  其次,由于新浪取消了链接博客的选项,但该功能并没有取消,您可以询问以下地址并进行配置。
  第三种方法需要使用新浪的界面,如下:
  1) 前往新浪微博开放平台创建现场应用。您可以通过或不通过审核,但如果通过,您可以在微博底部显示来自XX的应用程序,例如来自KingGoo技术博客图片。如何创建你你可以在百度和谷歌上搜索。很简单(但是如果你没有通过review想通过review,我可以提供有偿帮助~)。创建应用后,需要使用App Key申请下方的应用;
  2)编辑你主题的functions.php文件并在最后添加以下代码
  // 微博同步function post_to_sina_weibo($post_ID) { if( wp_is_post_revision($post_ID) ) return; $get_post_info = get_post($post_ID); $get_post_centent = get_post($post_ID)->post_content; //去掉文章内的html编码的空格、换行、tab等符号(如果你文章的编码格式是这样子,可以将下面的"//"去掉即开启此功能) //$get_post_centent = str_replace("\t", " ", str_replace("\n", " ", str_replace(" ", " ", $get_post_centent))); $get_post_title = get_post($post_ID)->post_title; if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] != 'publish' ) { $request = new WP_Http; $status = '【' . strip_tags( $get_post_title ) . '】 ' . mb_strimwidth(strip_tags( apply_filters('the_content', $get_post_centent)),0, 132,'...') . ' 全文地址:' . get_permalink($post_ID) ; $api_url = 'https://api.weibo.com/2/statuses/update.json'; $body = array( 'status' => $status, 'source'=>'4135063399'); $headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); /* 如果你使用改方法,请注释掉上面$headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); 换成如下代码 //你的新浪微博登陆名 $username = '' ; //你的新浪微博登陆密码 $password = '' ; $headers = array( 'Authorization' => 'Basic ' . base64_encode('$username:$password')); */ $result = $request->post( $api_url , array( 'body' => $body, 'headers' => $headers ) ); }}add_action('publish_post', 'post_to_sina_weibo', 0);
  文章中需要用到wordpress自带的WP_Http类,我在github上找到了替代品:
  关于这个类的一个说明:EasyHttp是一个帮助你忽略不同php环境条件,乱发送http请求的php类。您不再需要关注当前的 php 环境是否支持 curl/fsockopen/fopen,EasyHttp 会自动选择最合适的方式进行 http 请求。 EasyHttp 派生自 WordPress 中的 WP_Http 类,它去除了对其他 WordPress 功能的所有依赖,将其拆分为不同的文件,并进行了少量简化。
  根据以上内容编写php代码1.php:
  浏览器访问1.php时返回如下内容:
  Array ([headers] => Array ([server] => nginx/1.2.0 [date] => Sun, 13 Oct 2013 02:23:46 GMT [content-type] => text /plain;charset=UTF-8 [content-length] => 76 [connection] => close [api-server-ip] => 10.75.0.170 [vary] => Accept-编码 [x-varnish] => 3299864740 [age] => 0 [via] => 1.1 varnish) [body] => Bad Content-Type header value:'application/x-www-form-urlencoded; charset ='[response] => Array ([code] => 400 [message] => Bad Request) [cookies] => Array () [filename] => )
  似乎是 400 Bad Request。百度点击了。意思是“由于语法格式错误,服务器无法理解此请求。不修改,客户端程序无法重复此请求。”
  你是如何解决这个问题的? 查看全部

  网站调用新浪微博内容(wordpress网站可以写php代码1.php文件测试.php)
  据说wordpress网站发帖时可以将文章同步到新浪微博,我想根据同样的方法写一个php代码测试。以下引用自:
  微博同步有插件、关联博客、非插件微博界面三种方式
  第一种是直接在百度上搜索;
  其次,由于新浪取消了链接博客的选项,但该功能并没有取消,您可以询问以下地址并进行配置。
  第三种方法需要使用新浪的界面,如下:
  1) 前往新浪微博开放平台创建现场应用。您可以通过或不通过审核,但如果通过,您可以在微博底部显示来自XX的应用程序,例如来自KingGoo技术博客图片。如何创建你你可以在百度和谷歌上搜索。很简单(但是如果你没有通过review想通过review,我可以提供有偿帮助~)。创建应用后,需要使用App Key申请下方的应用;
  2)编辑你主题的functions.php文件并在最后添加以下代码
  // 微博同步function post_to_sina_weibo($post_ID) { if( wp_is_post_revision($post_ID) ) return; $get_post_info = get_post($post_ID); $get_post_centent = get_post($post_ID)->post_content; //去掉文章内的html编码的空格、换行、tab等符号(如果你文章的编码格式是这样子,可以将下面的"//"去掉即开启此功能) //$get_post_centent = str_replace("\t", " ", str_replace("\n", " ", str_replace(" ", " ", $get_post_centent))); $get_post_title = get_post($post_ID)->post_title; if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] != 'publish' ) { $request = new WP_Http; $status = '【' . strip_tags( $get_post_title ) . '】 ' . mb_strimwidth(strip_tags( apply_filters('the_content', $get_post_centent)),0, 132,'...') . ' 全文地址:' . get_permalink($post_ID) ; $api_url = 'https://api.weibo.com/2/statuses/update.json'; $body = array( 'status' => $status, 'source'=>'4135063399'); $headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); /* 如果你使用改方法,请注释掉上面$headers = array( 'Authorization' => 'Basic ' . '1fFjYc3uQHZpcF32fS5jb146MxFeY19DYF53aWfzNA==' ); 换成如下代码 //你的新浪微博登陆名 $username = '' ; //你的新浪微博登陆密码 $password = '' ; $headers = array( 'Authorization' => 'Basic ' . base64_encode('$username:$password')); */ $result = $request->post( $api_url , array( 'body' => $body, 'headers' => $headers ) ); }}add_action('publish_post', 'post_to_sina_weibo', 0);
  文章中需要用到wordpress自带的WP_Http类,我在github上找到了替代品:
  关于这个类的一个说明:EasyHttp是一个帮助你忽略不同php环境条件,乱发送http请求的php类。您不再需要关注当前的 php 环境是否支持 curl/fsockopen/fopen,EasyHttp 会自动选择最合适的方式进行 http 请求。 EasyHttp 派生自 WordPress 中的 WP_Http 类,它去除了对其他 WordPress 功能的所有依赖,将其拆分为不同的文件,并进行了少量简化。
  根据以上内容编写php代码1.php:
  浏览器访问1.php时返回如下内容:
  Array ([headers] => Array ([server] => nginx/1.2.0 [date] => Sun, 13 Oct 2013 02:23:46 GMT [content-type] => text /plain;charset=UTF-8 [content-length] => 76 [connection] => close [api-server-ip] => 10.75.0.170 [vary] => Accept-编码 [x-varnish] => 3299864740 [age] => 0 [via] => 1.1 varnish) [body] => Bad Content-Type header value:'application/x-www-form-urlencoded; charset ='[response] => Array ([code] => 400 [message] => Bad Request) [cookies] => Array () [filename] => )
  似乎是 400 Bad Request。百度点击了。意思是“由于语法格式错误,服务器无法理解此请求。不修改,客户端程序无法重复此请求。”
  你是如何解决这个问题的?

网站调用新浪微博内容(AXMLPrinter2.jar反编译新浪微博的开放程度,居然比新浪还要封闭)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-09-04 20:03 • 来自相关话题

  网站调用新浪微博内容(AXMLPrinter2.jar反编译新浪微博的开放程度,居然比新浪还要封闭)
  首先,我们需要使用AXMLPrinter2.jar反编译新浪微博的AndroidManifest.xml,找到显示用户信息的页面。反编译后的代码如下:
  java -jar AXMLPrinter2.jar AndroidManifest.xml > a.xml
  打开反编译出来的a.xml,搜索userinfo,幸运的找到UserInfoActivity,如下图:
  UserInfoActivity注册了两个intent-filters,第一个注册的url是sinaweibo://userinfo?uid=3444956000。有了这些信息,通过如下代码调用新浪微博客户端显示用户信息:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("sinaweibo://userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  但是以上代码的前提是用户已经安装了新浪微博客户端,否则运行时会报错。好在还有第二个,我们可以用下面的代码来调用:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("http://weibo.cn/qr/userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  以上代码的效果是:
  如果用户没有安装新浪微博,他会直接调用浏览器打开那个地址;如果用户已安装新浪微博,则会弹出如下对话框供用户选择:
  
  我再次鄙视新浪微博的开放程度,即使这个功能没有开放。
  本来打算用同样的方法在腾讯微信上做同样的功能,结果发现腾讯把显示微信账号的activity设置为私有android:exported="false",比新浪更封闭。无语了。 ! 查看全部

  网站调用新浪微博内容(AXMLPrinter2.jar反编译新浪微博的开放程度,居然比新浪还要封闭)
  首先,我们需要使用AXMLPrinter2.jar反编译新浪微博的AndroidManifest.xml,找到显示用户信息的页面。反编译后的代码如下:
  java -jar AXMLPrinter2.jar AndroidManifest.xml > a.xml
  打开反编译出来的a.xml,搜索userinfo,幸运的找到UserInfoActivity,如下图:
  UserInfoActivity注册了两个intent-filters,第一个注册的url是sinaweibo://userinfo?uid=3444956000。有了这些信息,通过如下代码调用新浪微博客户端显示用户信息:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("sinaweibo://userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  但是以上代码的前提是用户已经安装了新浪微博客户端,否则运行时会报错。好在还有第二个,我们可以用下面的代码来调用:
  var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("http://weibo.cn/qr/userinfo?uid=3444956000";);
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
  以上代码的效果是:
  如果用户没有安装新浪微博,他会直接调用浏览器打开那个地址;如果用户已安装新浪微博,则会弹出如下对话框供用户选择:
  
  我再次鄙视新浪微博的开放程度,即使这个功能没有开放。
  本来打算用同样的方法在腾讯微信上做同样的功能,结果发现腾讯把显示微信账号的activity设置为私有android:exported="false",比新浪更封闭。无语了。 !

网站调用新浪微博内容(新浪微博的用户接口和话题接口实现了(组图))

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-09-03 12:06 • 来自相关话题

  网站调用新浪微博内容(新浪微博的用户接口和话题接口实现了(组图))
  以标题为标题,调用新浪微博的用户界面和话题界面,实现对新浪微博用户和关键词相关内容的搜索:
  
  选择搜索昵称:
  
  返回搜索昵称结果:
  
  选择搜索微博内容:
  
  返回微博搜索结果:
  
  但内容超过屏幕长度,滚动条会显示剩余内容:
  
  使用的插件有:kendoUI.js 操作UI,给界面切换添加特效幻灯片。 jscex.js 练习异步加载数据,绑定搜索id和搜索微博按钮两个响应功能。还是用jQuery的ajax调用新浪微博加载对应的api数据。
  本练习中遇到的问题并不平均。一开始是不熟悉kendoUI造成的。在kendoUI中,所有页面内容都放在同一个页面上,但是data-role="view"是用来区分各个页面的。默认情况下,首页显示第一个收录属性data-role="view" div;
  接下来是api调用的跨域问题。本来打算用jsonp数据格式来解决这个问题,但是据说jscex可以解决这个问题。看了后面,发现jecex.js好像也是jsonp格式的。
  看了jscex的样例,感觉好强大。但这一次只是简单地使用它定义的异步方法,$await()、$start() 来使用异步方法。以下是点击搜索昵称按钮的一系列操作的代码:
  
  其实还有一个没有解决的问题:在遍历返回的数据时,如果去掉if(index)判断语句,结果总是返回一个“undefined”。经过调试,发现underfined对应的索引其实是code,是正确的。结果对应的索引是数据。实在是没有办法,只能用这个判断了。希望以后能找到原因。 查看全部

  网站调用新浪微博内容(新浪微博的用户接口和话题接口实现了(组图))
  以标题为标题,调用新浪微博的用户界面和话题界面,实现对新浪微博用户和关键词相关内容的搜索:
  
  选择搜索昵称:
  
  返回搜索昵称结果:
  
  选择搜索微博内容:
  
  返回微博搜索结果:
  
  但内容超过屏幕长度,滚动条会显示剩余内容:
  
  使用的插件有:kendoUI.js 操作UI,给界面切换添加特效幻灯片。 jscex.js 练习异步加载数据,绑定搜索id和搜索微博按钮两个响应功能。还是用jQuery的ajax调用新浪微博加载对应的api数据。
  本练习中遇到的问题并不平均。一开始是不熟悉kendoUI造成的。在kendoUI中,所有页面内容都放在同一个页面上,但是data-role="view"是用来区分各个页面的。默认情况下,首页显示第一个收录属性data-role="view" div;
  接下来是api调用的跨域问题。本来打算用jsonp数据格式来解决这个问题,但是据说jscex可以解决这个问题。看了后面,发现jecex.js好像也是jsonp格式的。
  看了jscex的样例,感觉好强大。但这一次只是简单地使用它定义的异步方法,$await()、$start() 来使用异步方法。以下是点击搜索昵称按钮的一系列操作的代码:
  
  其实还有一个没有解决的问题:在遍历返回的数据时,如果去掉if(index)判断语句,结果总是返回一个“undefined”。经过调试,发现underfined对应的索引其实是code,是正确的。结果对应的索引是数据。实在是没有办法,只能用这个判断了。希望以后能找到原因。

网站调用新浪微博内容(试试用python调用微博API的SDK授权所必须的 )

网站优化优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-09-03 12:06 • 来自相关话题

  网站调用新浪微博内容(试试用python调用微博API的SDK授权所必须的
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写可以用这个地址代替,我试了一下,没问题,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
pprespan style="color: rgba(0, 128, 128, 1)"1/span api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span authorize_url =span style="color: rgba(0, 0, 0, 1)" api.get_authorize_url()
/spanspan style="color: rgba(0, 128, 128, 1)"3/span span style="color: rgba(0, 0, 255, 1)"print/spanspan style="color: rgba(0, 0, 0, 1)"(authorize_url)
/spanspan style="color: rgba(0, 128, 128, 1)"4/span webbrowser.open_new(authorize_url)/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/27174320-95b2c8e5fbaa430581575652dc9cabce.jpg' alt=''//p
p登录后会转成一个连接代码=92cc6accecfb5b2176adf58f4c/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
pprespan style="color: rgba(0, 128, 128, 1)"1/span request =span style="color: rgba(0, 0, 0, 1)" api.request_access_token(code, REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span access_token =span style="color: rgba(0, 0, 0, 1)" request.access_token
/spanspan style="color: rgba(0, 128, 128, 1)"3/span expires_in =span style="color: rgba(0, 0, 0, 1)" request.expires_in
/spanspan style="color: rgba(0, 128, 128, 1)"4/span span style="color: rgba(0, 0, 0, 1)"api.set_access_token(access_token, expires_in)
/spanspan style="color: rgba(0, 128, 128, 1)"5/span api.statuses.update.post(status=uspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Test OAuth 2.0 Send a Weibo!/spanspan style="color: rgba(128, 0, 0, 1)"'/span)/pre/p
pprespan style="font-size: 15px"access_token就是获得的token,expires_in是授权的过期时间/span span style="font-size: 15px"(UNIX时间)
/span/pre/p
pprespan style="font-size: 15px"用set_access_token保存授权。往下就可以调用微博接口了。测试发了一条微博
/span/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/28100233-96d97f1c16e14d11a07cc59330996baa.jpg' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
pimg src='https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif' alt=''//p
pimg src='https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif' alt=''//p
p访问微博/p
pprespan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" -*- coding: utf-8 -*- /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"/usr/bin/env python /span

span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"access to SinaWeibo By sinaweibopy /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"实现微博自动登录,token自动生成,保存及更新 /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"适合于后端服务调用 /span

span style="color: rgba(0, 0, 255, 1)"from/span weibo span style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" APIClient
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" pymongo
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" sys, os, urllib, urllib2
/spanspan style="color: rgba(0, 0, 255, 1)"from/span http_helper span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"from/span retry span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" json
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" ImportError:
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" simplejson as json

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" setting sys encoding to utf-8 /span
default_encoding = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"utf-8/spanspan style="color: rgba(128, 0, 0, 1)"'/span
span style="color: rgba(0, 0, 255, 1)"if/span sys.getdefaultencoding() !=span style="color: rgba(0, 0, 0, 1)" default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" weibo api访问配置 /span
APP_KEY = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app key /span
APP_SECRET = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app secret /span
REDIRECT_URL = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/default.html/spanspan style="color: rgba(128, 0, 0, 1)"'/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" callback url 授权回调页,与OAuth2.0 授权设置的一致 /span
USERID = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 登陆的微博用户名,必须是OAuth2.0 设置的测试账号 /span
USERPASSWD = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 用户密码 /span
span style="color: rgba(0, 0, 0, 1)"

client /span= APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" make_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"请求access token /span
params =span style="color: rgba(0, 0, 0, 1)" urllib.urlencode({
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"action/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"submit/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"withOfficalFlag/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"0/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"ticket/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"isLoginSina/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"response_type/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"code/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"regCallback/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"redirect_uri/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":REDIRECT_URL,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"client_id/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":APP_KEY,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"state/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"from/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"userId/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERID,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"passwd/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERPASSWD,
})

login_url /span= span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/authorize/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"

url /span=span style="color: rgba(0, 0, 0, 1)" client.get_authorize_url()
content /span=span style="color: rgba(0, 0, 0, 1)" urllib2.urlopen(url)
/spanspan style="color: rgba(0, 0, 255, 1)"if/spanspan style="color: rgba(0, 0, 0, 1)" content:
headers /span= { span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Referer/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)" : url }
request /span=span style="color: rgba(0, 0, 0, 1)" urllib2.Request(login_url, params, headers)
opener /span=span style="color: rgba(0, 0, 0, 1)" get_opener(False)
urllib2.install_opener(opener)
/spanspan style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
f /span=span style="color: rgba(0, 0, 0, 1)" opener.open(request)
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" f.url
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" urllib2.HTTPError, e:
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" e.geturl()
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 取到返回的code /span
code = return_redirect_uri.split(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"=/spanspan style="color: rgba(128, 0, 0, 1)"'/span)[1span style="color: rgba(0, 0, 0, 1)"]
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"得到token /span
token =span style="color: rgba(0, 0, 0, 1)" client.request_access_token(code,REDIRECT_URL)
save_access_token(token)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" save_access_token(token):
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"将access token保存到MongoDB数据库/span
mongoCon=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo

t/span=span style="color: rgba(0, 0, 0, 1)"{
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)""/span:token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"],
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)""/span:str(token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"]),
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"date/spanspan style="color: rgba(128, 0, 0, 1)""/span:time.strftime(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"%Y-%m-%d %H:%M:%S/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",time.localtime(time.time()))
}
db.token.insert(t,safe/span=span style="color: rgba(0, 0, 0, 1)"True)
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()/span
@retry(1span style="color: rgba(0, 0, 0, 1)")
/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" apply_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"从MongoDB读取及设置access token /span
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
mongoCon/span=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo
/spanspan style="color: rgba(0, 0, 255, 1)"if/span db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]

try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False

return True

if __name__ == "__main__":
apply_access_token()

# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
  
  重试.py
  import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.

delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff 0:
if rv == True or type(rv) == str: # Done on success ..
return rv
mtries -= 1 # consume an attempt
time.sleep(mdelay) # wait...
mdelay *= backoff # make future wait longer
rv = f(*args, **kwargs) # Try again
return False # Ran out of tries :-(
return f_retry # true decorator -> decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
   查看全部

  网站调用新浪微博内容(试试用python调用微博API的SDK授权所必须的
)
  因为最近接触到调用新浪微博开放接口的项目,想尝试用python调用微博API。
  SDK下载链接:代码不超过十几K,完全可以理解。
  如果你有微博账号,你可以创建一个应用,然后你就可以得到应用密钥和应用秘钥。这是应用获得 OAuth2.0 授权所必需的。
  要了解OAuth2,可以查看新浪微博链接的说明。除了app key和app secret外,OAuth2授权参数还需要网站回调地址redirect_uri,而且这个回调地址不允许在局域网内(什么是localhost,127.0.0.1 好像不行),这个真的让我着急了好久。我没有使用API​​调用网站,所以我查了很多。看到有人写可以用这个地址代替,我试了一下,没问题,这对Diosi来说是个好消息。
  我们先来一个简单的程序来感受一下:
  设置以下参数
  import sys
import weibo
import webbrowser
APP_KEY = ''
MY_APP_SECRET = ''
REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'
  获取微博授权网址,如第二行,用默认浏览器打开后,会要求登录微博,用需要授权的账号登录,如下图<//p
pprespan style="color: rgba(0, 128, 128, 1)"1/span api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span authorize_url =span style="color: rgba(0, 0, 0, 1)" api.get_authorize_url()
/spanspan style="color: rgba(0, 128, 128, 1)"3/span span style="color: rgba(0, 0, 255, 1)"print/spanspan style="color: rgba(0, 0, 0, 1)"(authorize_url)
/spanspan style="color: rgba(0, 128, 128, 1)"4/span webbrowser.open_new(authorize_url)/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/27174320-95b2c8e5fbaa430581575652dc9cabce.jpg' alt=''//p
p登录后会转成一个连接代码=92cc6accecfb5b2176adf58f4c/p
pkey是code值,是认证的关键。手动输入code值模拟认证/p
pprespan style="color: rgba(0, 128, 128, 1)"1/span request =span style="color: rgba(0, 0, 0, 1)" api.request_access_token(code, REDIRECT_URL)
/spanspan style="color: rgba(0, 128, 128, 1)"2/span access_token =span style="color: rgba(0, 0, 0, 1)" request.access_token
/spanspan style="color: rgba(0, 128, 128, 1)"3/span expires_in =span style="color: rgba(0, 0, 0, 1)" request.expires_in
/spanspan style="color: rgba(0, 128, 128, 1)"4/span span style="color: rgba(0, 0, 0, 1)"api.set_access_token(access_token, expires_in)
/spanspan style="color: rgba(0, 128, 128, 1)"5/span api.statuses.update.post(status=uspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Test OAuth 2.0 Send a Weibo!/spanspan style="color: rgba(128, 0, 0, 1)"'/span)/pre/p
pprespan style="font-size: 15px"access_token就是获得的token,expires_in是授权的过期时间/span span style="font-size: 15px"(UNIX时间)
/span/pre/p
pprespan style="font-size: 15px"用set_access_token保存授权。往下就可以调用微博接口了。测试发了一条微博
/span/pre/p
pimg src='https://images0.cnblogs.com/blog/515896/201304/28100233-96d97f1c16e14d11a07cc59330996baa.jpg' alt=''//p
p但是,这样的手动代码输入方式并不适合调用程序。是否可以在不打开链接的情况下请求登录并获得授权?经过多方搜索参考,对程序进行如下改进,可以自动获取并保存代码,方便程序服务调用。/p
pimg src='https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif' alt=''//p
pimg src='https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif' alt=''//p
p访问微博/p
pprespan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" -*- coding: utf-8 -*- /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"/usr/bin/env python /span

span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"access to SinaWeibo By sinaweibopy /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"实现微博自动登录,token自动生成,保存及更新 /spanspan style="color: rgba(0, 128, 0, 1)"
#/spanspan style="color: rgba(0, 128, 0, 1)"适合于后端服务调用 /span

span style="color: rgba(0, 0, 255, 1)"from/span weibo span style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" APIClient
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" pymongo
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" sys, os, urllib, urllib2
/spanspan style="color: rgba(0, 0, 255, 1)"from/span http_helper span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"from/span retry span style="color: rgba(0, 0, 255, 1)"import/span *
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" json
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" ImportError:
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" simplejson as json

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" setting sys encoding to utf-8 /span
default_encoding = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"utf-8/spanspan style="color: rgba(128, 0, 0, 1)"'/span
span style="color: rgba(0, 0, 255, 1)"if/span sys.getdefaultencoding() !=span style="color: rgba(0, 0, 0, 1)" default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" weibo api访问配置 /span
APP_KEY = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app key /span
APP_SECRET = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" app secret /span
REDIRECT_URL = span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/default.html/spanspan style="color: rgba(128, 0, 0, 1)"'/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" callback url 授权回调页,与OAuth2.0 授权设置的一致 /span
USERID = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 登陆的微博用户名,必须是OAuth2.0 设置的测试账号 /span
USERPASSWD = span style="color: rgba(128, 0, 0, 1)"''/span span style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 用户密码 /span
span style="color: rgba(0, 0, 0, 1)"

client /span= APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=span style="color: rgba(0, 0, 0, 1)"REDIRECT_URL)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" make_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"请求access token /span
params =span style="color: rgba(0, 0, 0, 1)" urllib.urlencode({
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"action/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"submit/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"withOfficalFlag/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"0/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"ticket/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"isLoginSina/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"response_type/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"code/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"regCallback/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"redirect_uri/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":REDIRECT_URL,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"client_id/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":APP_KEY,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"state/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"from/spanspan style="color: rgba(128, 0, 0, 1)"'/span:span style="color: rgba(128, 0, 0, 1)"''/spanspan style="color: rgba(0, 0, 0, 1)",
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"userId/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERID,
/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"passwd/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)":USERPASSWD,
})

login_url /span= span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"https://api.weibo.com/oauth2/authorize/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"

url /span=span style="color: rgba(0, 0, 0, 1)" client.get_authorize_url()
content /span=span style="color: rgba(0, 0, 0, 1)" urllib2.urlopen(url)
/spanspan style="color: rgba(0, 0, 255, 1)"if/spanspan style="color: rgba(0, 0, 0, 1)" content:
headers /span= { span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"Referer/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)" : url }
request /span=span style="color: rgba(0, 0, 0, 1)" urllib2.Request(login_url, params, headers)
opener /span=span style="color: rgba(0, 0, 0, 1)" get_opener(False)
urllib2.install_opener(opener)
/spanspan style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
f /span=span style="color: rgba(0, 0, 0, 1)" opener.open(request)
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" f.url
/spanspan style="color: rgba(0, 0, 255, 1)"except/spanspan style="color: rgba(0, 0, 0, 1)" urllib2.HTTPError, e:
return_redirect_uri /span=span style="color: rgba(0, 0, 0, 1)" e.geturl()
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)" 取到返回的code /span
code = return_redirect_uri.split(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"=/spanspan style="color: rgba(128, 0, 0, 1)"'/span)[1span style="color: rgba(0, 0, 0, 1)"]
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"得到token /span
token =span style="color: rgba(0, 0, 0, 1)" client.request_access_token(code,REDIRECT_URL)
save_access_token(token)

/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" save_access_token(token):
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"将access token保存到MongoDB数据库/span
mongoCon=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo

t/span=span style="color: rgba(0, 0, 0, 1)"{
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)""/span:token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"access_token/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"],
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)""/span:str(token[span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"expires_in/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)"]),
/spanspan style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"date/spanspan style="color: rgba(128, 0, 0, 1)""/span:time.strftime(span style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(128, 0, 0, 1)"%Y-%m-%d %H:%M:%S/spanspan style="color: rgba(128, 0, 0, 1)"'/spanspan style="color: rgba(0, 0, 0, 1)",time.localtime(time.time()))
}
db.token.insert(t,safe/span=span style="color: rgba(0, 0, 0, 1)"True)
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()/span
@retry(1span style="color: rgba(0, 0, 0, 1)")
/spanspan style="color: rgba(0, 0, 255, 1)"def/spanspan style="color: rgba(0, 0, 0, 1)" apply_access_token():
/spanspan style="color: rgba(0, 128, 0, 1)"#/spanspan style="color: rgba(0, 128, 0, 1)"从MongoDB读取及设置access token /span
span style="color: rgba(0, 0, 255, 1)"try/spanspan style="color: rgba(0, 0, 0, 1)":
mongoCon/span=pymongo.Connection(host=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"127.0.0.1/spanspan style="color: rgba(128, 0, 0, 1)""/span,port=27017span style="color: rgba(0, 0, 0, 1)")
db/span=span style="color: rgba(0, 0, 0, 1)" mongoCon.weibo
/spanspan style="color: rgba(0, 0, 255, 1)"if/span db.token.count()>0:
tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)
else:
make_access_token()
return False
for tokenInfo in tokenInfos:
access_token=tokenInfo["access_token"]
expires_in=tokenInfo["expires_in"]

try:
client.set_access_token(access_token, expires_in)
except StandardError, e:
if hasattr(e, 'error'):
if e.error == 'expired_token':
# token过期重新生成
make_access_token()
return False
else:
pass
except:
make_access_token()
return False

return True

if __name__ == "__main__":
apply_access_token()

# 以下为访问微博api的应用逻辑
# 以发布文字微博接口为例
client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')
  
  
  重试.py
  import math
import time
# Retry decorator with exponential backoff
def retry(tries, delay=1, backoff=2):
"""Retries a function or method until it returns True.

delay sets the initial delay, and backoff sets how much the delay should
lengthen after each failure. backoff must be greater than 1, or else it
isn't really a backoff. tries must be at least 0, and delay greater than
0."""
if backoff 0:
if rv == True or type(rv) == str: # Done on success ..
return rv
mtries -= 1 # consume an attempt
time.sleep(mdelay) # wait...
mdelay *= backoff # make future wait longer
rv = f(*args, **kwargs) # Try again
return False # Ran out of tries :-(
return f_retry # true decorator -> decorated function
return deco_retry # @retry(arg[, ...]) -> true decorator
  
  

网站调用新浪微博内容(微软人脉应用面临没有接口可供调用的困境(组图))

网站优化优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2021-09-02 19:07 • 来自相关话题

  网站调用新浪微博内容(微软人脉应用面临没有接口可供调用的困境(组图))
  原人网应用通过微博API接口实时获取用户微博联系人、更新、评论等,也可以直接通过人网应用发布新微博。
  
  然而,新浪微博最近更新了API接口、网络应用等相关应用,都面临着无接口调用的困境。
  微软在邮件中指出,如果用户已经将新浪微博链接到人民网应用程序,人民网应用程序将不再收到新信息,例如新联系人、评论等。
  如果用户之前没有将微博与人脉应用绑定,则无法再绑定。
  “分享到微博”功能也受到影响。微软表示,分享到微博功能也已于3月31日停止服务。
  以下是所有受影响的 Microsoft 产品:
  Outlook、Windows、Windows Phone 和 Office 365 日历同步(影响联系人同步) 联系人(影响联系人同步) Windows 8.1 和 Windows 8 个人连接(影响联系人同步) Windows 8.1 和 Windows 8 日历应用程序(影响联系人同步) Windows 8 照片库和视频制作(不能直接分享照片或视频到微博) Windows 8 照片应用程序(不能直接分享照片到微博) Windows Phone 8.1 和 Windows Phone 8 人物应用程序(影响联系人)同步) Windows Phone 8 和 Windows Phone 7 OneDrive(影响联系人同步) Windows Phone 8 和 Windows Phone 7 照片(不能直接分享照片到微博) Windows Live 包日历和联系人(影响联系人同步) OneDrive(不能直接发布照片存储在 OneDrive 到微博)Office 连接服务(查看 Office 帐户时,微博将不再显示为连接服务) Outl ook in Outlook 2016 和 Outlook 2013 Social Connector(OSC会直接提示密码错误,动态无法更新,可以直接删除微博连接)Office 365Web上的Outlook(影响联系人同步)
  目前新浪微博开放平台收紧,很多原有API被限制或不能直接调用。这也遭到了大量开发者的谴责。
  在之前的API调整中,微博曾经限制第三方微博客户端获取用户的关注、粉丝和微博内容。大量第三方微博客户端正在慢慢消失。
  可以预见,微博的API会继续收紧,需要使用其API的开发者应提前做好准备,以免影响开发产品的正常使用。
  关于微软的详细通知可以在这里找到:新浪微博连接将不可用 查看全部

  网站调用新浪微博内容(微软人脉应用面临没有接口可供调用的困境(组图))
  原人网应用通过微博API接口实时获取用户微博联系人、更新、评论等,也可以直接通过人网应用发布新微博。
  
  然而,新浪微博最近更新了API接口、网络应用等相关应用,都面临着无接口调用的困境。
  微软在邮件中指出,如果用户已经将新浪微博链接到人民网应用程序,人民网应用程序将不再收到新信息,例如新联系人、评论等。
  如果用户之前没有将微博与人脉应用绑定,则无法再绑定。
  “分享到微博”功能也受到影响。微软表示,分享到微博功能也已于3月31日停止服务。
  以下是所有受影响的 Microsoft 产品:
  Outlook、Windows、Windows Phone 和 Office 365 日历同步(影响联系人同步) 联系人(影响联系人同步) Windows 8.1 和 Windows 8 个人连接(影响联系人同步) Windows 8.1 和 Windows 8 日历应用程序(影响联系人同步) Windows 8 照片库和视频制作(不能直接分享照片或视频到微博) Windows 8 照片应用程序(不能直接分享照片到微博) Windows Phone 8.1 和 Windows Phone 8 人物应用程序(影响联系人)同步) Windows Phone 8 和 Windows Phone 7 OneDrive(影响联系人同步) Windows Phone 8 和 Windows Phone 7 照片(不能直接分享照片到微博) Windows Live 包日历和联系人(影响联系人同步) OneDrive(不能直接发布照片存储在 OneDrive 到微博)Office 连接服务(查看 Office 帐户时,微博将不再显示为连接服务) Outl ook in Outlook 2016 和 Outlook 2013 Social Connector(OSC会直接提示密码错误,动态无法更新,可以直接删除微博连接)Office 365Web上的Outlook(影响联系人同步)
  目前新浪微博开放平台收紧,很多原有API被限制或不能直接调用。这也遭到了大量开发者的谴责。
  在之前的API调整中,微博曾经限制第三方微博客户端获取用户的关注、粉丝和微博内容。大量第三方微博客户端正在慢慢消失。
  可以预见,微博的API会继续收紧,需要使用其API的开发者应提前做好准备,以免影响开发产品的正常使用。
  关于微软的详细通知可以在这里找到:新浪微博连接将不可用

网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-08-30 03:02 • 来自相关话题

  网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)
  要求
  手头的一个应用需要添加分享到新浪微博的功能。这个功能在目前的应用中很常见。
  分享到新浪微博其实就是发一条特定内容的微博,所以需要新浪微博SDK。
  微博SDK
  SDK 下载链接收录了很多平台的包,包括安卓版本。
  下载后请务必阅读SDK文档,运行自带的demo,对SDK的使用有一个大致的了解。
  发微博的麻烦
  运行DEMO后发现发送微博的功能是通过调用微博客户端实现的。如果用户没有安装,会提示用户下载或选择放弃发送。 . 这显然是不可靠的,因为还有很多用户没有安装微博客户端。
  
  网上很多人也遇到过这个问题。从他们的说法来看,之前版本的微博SDK好像还有发送微博的功能,但是新版本的SDK中已经没有了。
  但是demo里面有个提示:如果不想用微博客户端分享,请参考OpenAPI。
  那我们来看看这个OpenAPI有哪些功能。
  开放API
  OpenAPI 文档:%E5%BE%AE%E5%8D%9AAPI
  可以看出OpenAPI是通过Http请求来进行一些操作的,可以进行的操作基本涵盖了微博应用的方方面面。
  我们找到了发送微博的API:status/update
  文档的描述很详细。接口通过POST方法改变。请求参数有很多,但只有一个是必须的。但是要改界面,需要登录,所以必须在参数中加上已经授权登录的AccessToken:
  参数名称必须选择类型和作用域描述
  状态
  真实
  字符串
  要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字。
  访问令牌
  真实
  字符串
  登录后获得,详情见后文
  现在,发送微博的逻辑很清楚了,就是一个post请求。另一个需要解决的问题是AccessToken,即登录授权。
  登录授权
  并不是想让用户在你的应用中登录微博直接写代码,因为用户在你的应用中输入了账号信息,所以为了用户的账号安全,这是有风险的,所以如果你的应用需要添加微博功能,需要新浪审核。这个过程我还没有完全走完,大家可以参考微博文档的帮助:手机客户端访问
  这个文章主要是讲程序的,就不纠结这些过程了。简而言之,我们需要的是一个APPKEY,它是登录授权所需要的。我们现在可以使用SDK微博应用demo的APPKEY进行实验了。
  DEMO练习步骤因为使用微博DEMO的APPKEY,所以需要替换默认的debug.keystore
  在 C:\Users\XXXXX.android 目录中,将 Android 默认的 debug.keystore 替换为 GitHub 上提供的官方 debug.keystore。
  请注意:这一步是必须的。如果没有替换,演示程序在运行时将无法正确授权成功。在更换之前,最好备份一下原来的debug.keystore。另外,debug.keysotre 是新浪官方的。除编译运行官方DEMO外,请勿直接使用。出于安全原因,您应该为您的应用程序提供一个密钥。创建一个新的android项目,并将包命名为:com.sina.weibo.sdk.demo 将微博DEMO中的Constants.java复制到项目中
  在 AndroidManifest.xml 中添加权限:
  主界面的代码,登录授权部分的代码直接取自微博官方demo,发送微博部分就是上面分析的实现:
   public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
/** 微博 Web 授权类,提供登陆等功能 */
private WeiboAuth mWeiboAuth;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
private TextView mTokenInfoTV;
private EditText mMessageET;
private Button mSendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mTokenInfoTV = (TextView) findViewById(R.id.textView_tokenInfo);
mMessageET = (EditText) findViewById(R.id.editText_message);
mSendBtn = (Button) findViewById(R.id.button_sendWeibo);
// 获取Token
findViewById(R.id.button_getToken).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWeiboAuth.anthorize(new AuthListener());
}
});
// 发送微博
mMessageET.setVisibility(View.GONE);
mSendBtn.setVisibility(View.GONE);
mSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendWeibo(mMessageET.getText().toString());
}
});
}
// 发送微博
protected void sendWeibo(String string) {
//组织post参数
List params = new LinkedList();
params.add(new BasicNameValuePair("status", string));
params.add(new BasicNameValuePair("access_token", mAccessToken.getToken()));
HttpClient httpClient = new DefaultHttpClient();
//传入post方法的请求地址,即发送微博的api接口
HttpPost postMethod = new HttpPost("https://api.weibo.com/2/statuses/update.json");
try {
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
HttpResponse httpResponse = httpClient.execute(postMethod);
//将返回结果转为字符串,通过文档可知返回结果为json字符串,结构请参考文档
String resultStr=EntityUtils.toString(httpResponse.getEntity());
Log.e(TAG, resultStr);
//从json字符串中建立JSONObject
JSONObject resultJson = new JSONObject(resultStr);
//如果发送微博失败的话,返回字段中有"error"字段,通过判断是否存在该字段即可知道是否发送成功
if (resultJson.has("error")) {
Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show();
}
} catch (UnsupportedEncodingException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ClientProtocolException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (IOException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ParseException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (JSONException e) {
Log.e(TAG, e.getLocalizedMessage());
}
}
//登录授权接口
class AuthListener implements WeiboAuthListener {
//登录成功
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView();
// 显示发送微博的按钮和输入框
mSendBtn.setVisibility(View.VISIBLE);
mMessageET.setVisibility(View.VISIBLE);
// 保存 Token 到 SharedPreferences
// AccessTokenKeeper.writeAccessToken(MainActivity.this,
// mAccessToken);
Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
} else {
// 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
String code = values.getString("code");
String message = "授权失败";
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "取消授权", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
//显示token信息
private void updateTokenView() {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken
.getExpiresTime()));
String format = "Token:%1$s \n有效期:%2$s";
mTokenInfoTV.setText(String.format(format, mAccessToken.getToken(), date));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
  主界面的布局代码:
  运行效果
  
  
  
  发微博DEMO下载地址 查看全部

  网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)
  要求
  手头的一个应用需要添加分享到新浪微博的功能。这个功能在目前的应用中很常见。
  分享到新浪微博其实就是发一条特定内容的微博,所以需要新浪微博SDK。
  微博SDK
  SDK 下载链接收录了很多平台的包,包括安卓版本。
  下载后请务必阅读SDK文档,运行自带的demo,对SDK的使用有一个大致的了解。
  发微博的麻烦
  运行DEMO后发现发送微博的功能是通过调用微博客户端实现的。如果用户没有安装,会提示用户下载或选择放弃发送。 . 这显然是不可靠的,因为还有很多用户没有安装微博客户端。
  
  网上很多人也遇到过这个问题。从他们的说法来看,之前版本的微博SDK好像还有发送微博的功能,但是新版本的SDK中已经没有了。
  但是demo里面有个提示:如果不想用微博客户端分享,请参考OpenAPI。
  那我们来看看这个OpenAPI有哪些功能。
  开放API
  OpenAPI 文档:%E5%BE%AE%E5%8D%9AAPI
  可以看出OpenAPI是通过Http请求来进行一些操作的,可以进行的操作基本涵盖了微博应用的方方面面。
  我们找到了发送微博的API:status/update
  文档的描述很详细。接口通过POST方法改变。请求参数有很多,但只有一个是必须的。但是要改界面,需要登录,所以必须在参数中加上已经授权登录的AccessToken:
  参数名称必须选择类型和作用域描述
  状态
  真实
  字符串
  要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字。
  访问令牌
  真实
  字符串
  登录后获得,详情见后文
  现在,发送微博的逻辑很清楚了,就是一个post请求。另一个需要解决的问题是AccessToken,即登录授权。
  登录授权
  并不是想让用户在你的应用中登录微博直接写代码,因为用户在你的应用中输入了账号信息,所以为了用户的账号安全,这是有风险的,所以如果你的应用需要添加微博功能,需要新浪审核。这个过程我还没有完全走完,大家可以参考微博文档的帮助:手机客户端访问
  这个文章主要是讲程序的,就不纠结这些过程了。简而言之,我们需要的是一个APPKEY,它是登录授权所需要的。我们现在可以使用SDK微博应用demo的APPKEY进行实验了。
  DEMO练习步骤因为使用微博DEMO的APPKEY,所以需要替换默认的debug.keystore
  在 C:\Users\XXXXX.android 目录中,将 Android 默认的 debug.keystore 替换为 GitHub 上提供的官方 debug.keystore。
  请注意:这一步是必须的。如果没有替换,演示程序在运行时将无法正确授权成功。在更换之前,最好备份一下原来的debug.keystore。另外,debug.keysotre 是新浪官方的。除编译运行官方DEMO外,请勿直接使用。出于安全原因,您应该为您的应用程序提供一个密钥。创建一个新的android项目,并将包命名为:com.sina.weibo.sdk.demo 将微博DEMO中的Constants.java复制到项目中
  在 AndroidManifest.xml 中添加权限:
  主界面的代码,登录授权部分的代码直接取自微博官方demo,发送微博部分就是上面分析的实现:
   public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
/** 微博 Web 授权类,提供登陆等功能 */
private WeiboAuth mWeiboAuth;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
private TextView mTokenInfoTV;
private EditText mMessageET;
private Button mSendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mTokenInfoTV = (TextView) findViewById(R.id.textView_tokenInfo);
mMessageET = (EditText) findViewById(R.id.editText_message);
mSendBtn = (Button) findViewById(R.id.button_sendWeibo);
// 获取Token
findViewById(R.id.button_getToken).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWeiboAuth.anthorize(new AuthListener());
}
});
// 发送微博
mMessageET.setVisibility(View.GONE);
mSendBtn.setVisibility(View.GONE);
mSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendWeibo(mMessageET.getText().toString());
}
});
}
// 发送微博
protected void sendWeibo(String string) {
//组织post参数
List params = new LinkedList();
params.add(new BasicNameValuePair("status", string));
params.add(new BasicNameValuePair("access_token", mAccessToken.getToken()));
HttpClient httpClient = new DefaultHttpClient();
//传入post方法的请求地址,即发送微博的api接口
HttpPost postMethod = new HttpPost("https://api.weibo.com/2/statuses/update.json";);
try {
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
HttpResponse httpResponse = httpClient.execute(postMethod);
//将返回结果转为字符串,通过文档可知返回结果为json字符串,结构请参考文档
String resultStr=EntityUtils.toString(httpResponse.getEntity());
Log.e(TAG, resultStr);
//从json字符串中建立JSONObject
JSONObject resultJson = new JSONObject(resultStr);
//如果发送微博失败的话,返回字段中有"error"字段,通过判断是否存在该字段即可知道是否发送成功
if (resultJson.has("error")) {
Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show();
}
} catch (UnsupportedEncodingException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ClientProtocolException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (IOException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (ParseException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (JSONException e) {
Log.e(TAG, e.getLocalizedMessage());
}
}
//登录授权接口
class AuthListener implements WeiboAuthListener {
//登录成功
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView();
// 显示发送微博的按钮和输入框
mSendBtn.setVisibility(View.VISIBLE);
mMessageET.setVisibility(View.VISIBLE);
// 保存 Token 到 SharedPreferences
// AccessTokenKeeper.writeAccessToken(MainActivity.this,
// mAccessToken);
Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
} else {
// 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
String code = values.getString("code");
String message = "授权失败";
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "取消授权", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
//显示token信息
private void updateTokenView() {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken
.getExpiresTime()));
String format = "Token:%1$s \n有效期:%2$s";
mTokenInfoTV.setText(String.format(format, mAccessToken.getToken(), date));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
  主界面的布局代码:
  运行效果
  
  
  
  发微博DEMO下载地址

网站调用新浪微博内容(网站调用新浪微博内容,并根据新浪开放平台返回给网站的内容经过若干次的拆分混淆,)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-08-29 03:02 • 来自相关话题

  网站调用新浪微博内容(网站调用新浪微博内容,并根据新浪开放平台返回给网站的内容经过若干次的拆分混淆,)
  网站调用新浪微博内容,并根据新浪微博的api开放平台返回给网站的内容经过若干次的拆分混淆,就变成了今天这个样子,其实twitter调用的是推特这个api,新浪的这个爬虫api是新浪在处理推特的微博后添加上去的
  每个微博都相当于一条新浪的关联记录:点赞,评论,转发等等都会被记录。如果博主不想再计算这些点赞和转发就不点赞和转发,直接把点赞记录清空就好。再说了,
  看看199it上面的信息采集,选择一个排名高,规模大的博客,等写好代码后,我们一起来看看采集结果。
  加上新浪微博的api
  我用的是jsps家的一个技术小哥研发的工具,直接读取传入的api方可进行抓取。
  用户的转发只是多了一步读取的过程。
  因为微博只是新浪系统的一部分
  因为微博只是新浪系统的一部分,而且博客未被关注的有可能成为僵尸粉。
  新浪博客已经关闭,
  都是瞎扯,微博是新浪系统的一部分,
  弱爆了,今天我为了采集新浪微博内容,爬了六层架构。
  因为新浪网站上读取的不是微博内容。而是新浪内容的互动内容,我们称之为热门微博的rssextractor。这种爬虫会让新浪的读取速度更快。
  都被猜中了o(∩_∩)o哈哈~而且貌似有很多人的截图是别人抓取的原微博地址, 查看全部

  网站调用新浪微博内容(网站调用新浪微博内容,并根据新浪开放平台返回给网站的内容经过若干次的拆分混淆,)
  网站调用新浪微博内容,并根据新浪微博的api开放平台返回给网站的内容经过若干次的拆分混淆,就变成了今天这个样子,其实twitter调用的是推特这个api,新浪的这个爬虫api是新浪在处理推特的微博后添加上去的
  每个微博都相当于一条新浪的关联记录:点赞,评论,转发等等都会被记录。如果博主不想再计算这些点赞和转发就不点赞和转发,直接把点赞记录清空就好。再说了,
  看看199it上面的信息采集,选择一个排名高,规模大的博客,等写好代码后,我们一起来看看采集结果。
  加上新浪微博的api
  我用的是jsps家的一个技术小哥研发的工具,直接读取传入的api方可进行抓取。
  用户的转发只是多了一步读取的过程。
  因为微博只是新浪系统的一部分
  因为微博只是新浪系统的一部分,而且博客未被关注的有可能成为僵尸粉。
  新浪博客已经关闭,
  都是瞎扯,微博是新浪系统的一部分,
  弱爆了,今天我为了采集新浪微博内容,爬了六层架构。
  因为新浪网站上读取的不是微博内容。而是新浪内容的互动内容,我们称之为热门微博的rssextractor。这种爬虫会让新浪的读取速度更快。
  都被猜中了o(∩_∩)o哈哈~而且貌似有很多人的截图是别人抓取的原微博地址,

网站调用新浪微博内容(api发新微博网上现有教程中的发送微博接口(updateStatus),)

网站优化优采云 发表了文章 • 0 个评论 • 139 次浏览 • 2021-08-28 15:13 • 来自相关话题

  网站调用新浪微博内容(api发新微博网上现有教程中的发送微博接口(updateStatus),)
  最近有一个项目需要调用微博API来发布新的微博。在网上找了很多相关的教程,遇到了很多坑。后来发邮件给官方发现微博官方早在2017年3月就调整了相关接口,取消了现有在线教程中的微博发送接口(updateStatus),导致调用该接口导致权限不足再次。 ,当时折腾了半天。特此发个新文章,希望大家不要掉坑。
  首先登录开放平台创建应用
  首先,您需要到微博开放平台申请开发者账号创建新应用。您可以直接使用您的微博帐户登录。登录后点击微连接选择其他,根据需要选择新建应用(客户端、网页应用和浏览器插件)。
  
  二、应用相关设置
  首先在应用信息中编辑应用的基本信息,包括应用介绍的目的。一定要填写安全域名,自己测试的时候随便填写即可。申请企业时需填写企业相关域名。
  
  您还需要在应用高级信息中设置OAuth2.0的授权回调页面。您也可以在本次测试中随意填写。当应用程序发起用户授权时,会成功或取消重定向的页面地址。
  
  三、下载微博java sdk
  点击sdk下载地址,跳转回github页面。页面上有示例提示如何使用,下载即可。下载后,将其导入代码编辑器。最重要的一步:修改config.properties文件中的字段值。值的来源在应用信息中。
  
  四、运行实例获取授权码
  修改配置文件后,先打开examples包下oauth2.0下的OAuth4Code.java文件,直接运行main方法。此时,默认浏览器会打开用户授权页面。授权后浏览器地址最后会加一个code=******。将代码复制粘贴到编辑器控制台,然后回车返回授权信息。
  复制返回的授权信息中accessToken的值,即授权码。
  AccessToken [accessToken=2.00******, expireIn=11255**, refreshToken=,uid=****] 有了这个授权码,我们就可以正式运营微博了。
  注意:微博api中的所有操作都需要得到OAuth2.0的授权。每种方法都需要一个授权码。未经审核的应用程序授权码仅在一天内有效。有效期为30天,如果获得应用所属开发者授权,则为5年。因此,开发者在调用时需要确定授权码的有效期,到期后应引导用户重新授权。
  五、api应用的微博
  examples包下都是官方微博API实例,之前的微博发送接口在weibo4j.examples.timeline下。其中UpdateStatus.java和Upload.java是发送微博文本,另一个是发送带图片的微博实例。打开之后发现发送的微博都是调用weibo4j.Timeline.java这个类。
  不过,微博官方已经取消了updateStatus等相关的微博发送接口,这些接口已经不能再调用了,但是因为java SDK是2014版本,这些方法还是存在的。后续替换之前的updateStatus接口是status/share(第三方分享链接到微博)
  
  我们使用这个接口发送微博。由于java sdk是2014版本,这个版本没有这个接口方法,所以我们需要根据他的调用方法来写一个新的接口。因为接口只有两个必填参数,一个微博文本和授权码,类似于updateStatus。所以我们可以打开weibo4j.Timeline.java找到updateStatus方法,复制一份,改方法名,替换json。这样发微博不带图的方法就完成了。
   
  public Status updateStatus(String status) 抛出 WeiboException {
  返回新状态(client.post(WeiboConfig.getValue("baseURL")
  + "statuses/update.json",
  new PostParameter[] {new PostParameter("status", status) },
  access_token));
  }
  /** 查看全部

  网站调用新浪微博内容(api发新微博网上现有教程中的发送微博接口(updateStatus),)
  最近有一个项目需要调用微博API来发布新的微博。在网上找了很多相关的教程,遇到了很多坑。后来发邮件给官方发现微博官方早在2017年3月就调整了相关接口,取消了现有在线教程中的微博发送接口(updateStatus),导致调用该接口导致权限不足再次。 ,当时折腾了半天。特此发个新文章,希望大家不要掉坑。
  首先登录开放平台创建应用
  首先,您需要到微博开放平台申请开发者账号创建新应用。您可以直接使用您的微博帐户登录。登录后点击微连接选择其他,根据需要选择新建应用(客户端、网页应用和浏览器插件)。
  
  二、应用相关设置
  首先在应用信息中编辑应用的基本信息,包括应用介绍的目的。一定要填写安全域名,自己测试的时候随便填写即可。申请企业时需填写企业相关域名。
  
  您还需要在应用高级信息中设置OAuth2.0的授权回调页面。您也可以在本次测试中随意填写。当应用程序发起用户授权时,会成功或取消重定向的页面地址。
  
  三、下载微博java sdk
  点击sdk下载地址,跳转回github页面。页面上有示例提示如何使用,下载即可。下载后,将其导入代码编辑器。最重要的一步:修改config.properties文件中的字段值。值的来源在应用信息中。
  
  四、运行实例获取授权码
  修改配置文件后,先打开examples包下oauth2.0下的OAuth4Code.java文件,直接运行main方法。此时,默认浏览器会打开用户授权页面。授权后浏览器地址最后会加一个code=******。将代码复制粘贴到编辑器控制台,然后回车返回授权信息。
  复制返回的授权信息中accessToken的值,即授权码。
  AccessToken [accessToken=2.00******, expireIn=11255**, refreshToken=,uid=****] 有了这个授权码,我们就可以正式运营微博了。
  注意:微博api中的所有操作都需要得到OAuth2.0的授权。每种方法都需要一个授权码。未经审核的应用程序授权码仅在一天内有效。有效期为30天,如果获得应用所属开发者授权,则为5年。因此,开发者在调用时需要确定授权码的有效期,到期后应引导用户重新授权。
  五、api应用的微博
  examples包下都是官方微博API实例,之前的微博发送接口在weibo4j.examples.timeline下。其中UpdateStatus.java和Upload.java是发送微博文本,另一个是发送带图片的微博实例。打开之后发现发送的微博都是调用weibo4j.Timeline.java这个类。
  不过,微博官方已经取消了updateStatus等相关的微博发送接口,这些接口已经不能再调用了,但是因为java SDK是2014版本,这些方法还是存在的。后续替换之前的updateStatus接口是status/share(第三方分享链接到微博)
  
  我们使用这个接口发送微博。由于java sdk是2014版本,这个版本没有这个接口方法,所以我们需要根据他的调用方法来写一个新的接口。因为接口只有两个必填参数,一个微博文本和授权码,类似于updateStatus。所以我们可以打开weibo4j.Timeline.java找到updateStatus方法,复制一份,改方法名,替换json。这样发微博不带图的方法就完成了。
   
  public Status updateStatus(String status) 抛出 WeiboException {
  返回新状态(client.post(WeiboConfig.getValue("baseURL")
  + "statuses/update.json",
  new PostParameter[] {new PostParameter("status", status) },
  access_token));
  }
  /**

网站调用新浪微博内容(iOS开发中,分享到公众平台常用的第三方SDK)

网站优化优采云 发表了文章 • 0 个评论 • 134 次浏览 • 2021-08-28 15:10 • 来自相关话题

  网站调用新浪微博内容(iOS开发中,分享到公众平台常用的第三方SDK)
  ShareSDK 是 iOS 开发中常用的第三方 SDK,共享给公共平台。其友好的包装使分享更容易。您只需要根据各个平台的分享情况,调用分享方法,构造需要的参数即可。没关系。我用ShareSDK分享过很多次了,分享到新浪微博是我觉得最有可能遇到的,尤其是ios9之后。在这里与您分享经验,避免不可避免的问题。
  现在最新版本的ShareSDK已经达到3.x,比之前的版本更加简洁。这里就不介绍了,官方文档已经很清楚了。我直接分享如何融入成功的过程。使用pod下载ShareSDK,省去添加需要的框架和一些配置,推荐大家使用
  1.填写白名单。六个最好都写:sinaweibo sinaweibohd sinaweibosso sinaweibohdsso weibosdk weibosdk2.5(如果导入新浪SDK需要后两个)
  2.填写方案。 Scheme的正确与否直接影响分享到新浪微博客户端能否跳转回自己的应用。填错了就回不来了,也不会收到分享状态结果的回调。新浪微博Scheme规则:wb+appKey。
  3.初始化新浪微博平台:下面authType选择SDKAuthTypeBoth,支持web端和新浪微博客户端。 SSDKAuthTypeWeb 仅支持网页授权。大家要注意,网页授权是在app内共享的。第一次授权时弹出授权界面后,一旦授权成功,以后点击分享不会重定向,可以直接在app中分享。获取共享回调。客户端下共享,每次第一次授权后都会重定向到客户端。
  
  4. 构造共享参数信息。 shareParams 是一个参数信息字典。新浪微博构建信息参数的方法与其他平台略有不同。 (1)。新浪微博原来不能分享链接,他只能分享文字和图片,不像微信,所以不要想像微信一样直接带一个shareUrl,直接点击看网页。2) .如果你想在微博上分享一个链接,你只能用文字来写。作为内容分享。分享。微博会将链接显示为网页链接。点击网页链接,您可以跳转到链接。使用其他应用分享到新浪微博进行验证。(3)这里我强调一下,在新浪微博的参数信息中,图片字段,如果你想上传网络图片,你必须有一个高级的写作界面,并且需要去新浪微博公众平台申请,否则会报错。为避免此类问题,可以使用本地图片,或者从网上下载图片。如果要问为什么客户端分享没有找到这个问题,是因为两种方式共享的内部接口不同,客户端共享不会有这个错误prob lem,只有网页。
  
  5. 允许客户端共享。 [shareParams SSDKEnableUseClientShare];这句话的意思是允许客户端共享。如果有客户端,在新浪微博平台分享会调用新浪微博客户端。当然,如果没有安装客户端,web端的共享不会受到影响。
  6.分享方式的调用选项。
  (1)使用ShareSDK系统弹框分享:参考ShareSDK官方demo,可以知道它的风格。
  
  (2)使用ShareSDK系统的编辑框进行分享,点击你想要的分享平台按钮,会弹出默认的编辑框:参考ShareSDK官方demo了解其风格。
  
  (3)直接跳转到第三方平台分享。点击你的app中代表某个平台的按钮,可以直接跳转到第三方平台分享。不需要经过中间过程
  
  (4)选择直接跳转到新浪微博分享的方式,跳转到新浪微博客户端后的显示方式
  
  (5)。点击发送,可以在网络情况下分享成功,然后传回自己的app。如果Scheme配置错了,就不会跳回来了,切记。整体是这样的过程是,你有我没想到的简单。 查看全部

  网站调用新浪微博内容(iOS开发中,分享到公众平台常用的第三方SDK)
  ShareSDK 是 iOS 开发中常用的第三方 SDK,共享给公共平台。其友好的包装使分享更容易。您只需要根据各个平台的分享情况,调用分享方法,构造需要的参数即可。没关系。我用ShareSDK分享过很多次了,分享到新浪微博是我觉得最有可能遇到的,尤其是ios9之后。在这里与您分享经验,避免不可避免的问题。
  现在最新版本的ShareSDK已经达到3.x,比之前的版本更加简洁。这里就不介绍了,官方文档已经很清楚了。我直接分享如何融入成功的过程。使用pod下载ShareSDK,省去添加需要的框架和一些配置,推荐大家使用
  1.填写白名单。六个最好都写:sinaweibo sinaweibohd sinaweibosso sinaweibohdsso weibosdk weibosdk2.5(如果导入新浪SDK需要后两个)
  2.填写方案。 Scheme的正确与否直接影响分享到新浪微博客户端能否跳转回自己的应用。填错了就回不来了,也不会收到分享状态结果的回调。新浪微博Scheme规则:wb+appKey。
  3.初始化新浪微博平台:下面authType选择SDKAuthTypeBoth,支持web端和新浪微博客户端。 SSDKAuthTypeWeb 仅支持网页授权。大家要注意,网页授权是在app内共享的。第一次授权时弹出授权界面后,一旦授权成功,以后点击分享不会重定向,可以直接在app中分享。获取共享回调。客户端下共享,每次第一次授权后都会重定向到客户端。
  
  4. 构造共享参数信息。 shareParams 是一个参数信息字典。新浪微博构建信息参数的方法与其他平台略有不同。 (1)。新浪微博原来不能分享链接,他只能分享文字和图片,不像微信,所以不要想像微信一样直接带一个shareUrl,直接点击看网页。2) .如果你想在微博上分享一个链接,你只能用文字来写。作为内容分享。分享。微博会将链接显示为网页链接。点击网页链接,您可以跳转到链接。使用其他应用分享到新浪微博进行验证。(3)这里我强调一下,在新浪微博的参数信息中,图片字段,如果你想上传网络图片,你必须有一个高级的写作界面,并且需要去新浪微博公众平台申请,否则会报错。为避免此类问题,可以使用本地图片,或者从网上下载图片。如果要问为什么客户端分享没有找到这个问题,是因为两种方式共享的内部接口不同,客户端共享不会有这个错误prob lem,只有网页。
  
  5. 允许客户端共享。 [shareParams SSDKEnableUseClientShare];这句话的意思是允许客户端共享。如果有客户端,在新浪微博平台分享会调用新浪微博客户端。当然,如果没有安装客户端,web端的共享不会受到影响。
  6.分享方式的调用选项。
  (1)使用ShareSDK系统弹框分享:参考ShareSDK官方demo,可以知道它的风格。
  
  (2)使用ShareSDK系统的编辑框进行分享,点击你想要的分享平台按钮,会弹出默认的编辑框:参考ShareSDK官方demo了解其风格。
  
  (3)直接跳转到第三方平台分享。点击你的app中代表某个平台的按钮,可以直接跳转到第三方平台分享。不需要经过中间过程
  
  (4)选择直接跳转到新浪微博分享的方式,跳转到新浪微博客户端后的显示方式
  
  (5)。点击发送,可以在网络情况下分享成功,然后传回自己的app。如果Scheme配置错了,就不会跳回来了,切记。整体是这样的过程是,你有我没想到的简单。

新浪微博是利用feed找到更新文章的模板,成功关联

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2021-08-19 07:09 • 来自相关话题

  新浪微博是利用feed找到更新文章的模板,成功关联
  新浪微博使用提要查找更新文章。只要给他指定feed地址,就可以成功关联。
  现在开始简单的修改织梦的模板。由于织梦无法生成整个站点的xml文件,所以我们首先要建立一个php程序,生成整个站点的xml。
  1、创建feed.php
  上面要注意的是修改模板的路径,保证在模板和目录下可以找到feed.htm
  2、创建feed.htm模板文件
  



{dede:global.cfg_webname/}
{dede:global.cfg_basehost/}
{dede:global.cfg_description/}
zh-cn
{dede:global.cfg_webname/}
{dede:global.cfg_adminemail/}
{dede:arclist row=&#39;60′ col=&#39;1′ titlelen=&#39;100′ orderby=&#39;pubdate&#39;}

[field:arcurl/]

[field:writer/]
[field:typename/]
[field:pubdate function=&#39;strftime("%a, %d %b %Y %H:%M:%S +0800",@me)&#39;/]
[field:arcurl/]


{/dede:arclist}


  请注意,不要忘记将我的 URL 更改为您需要的内容。
  3、修改index.htm首页模板
  由于新浪微博只能验证网址,无法写出完整路径。比如我写的是:。结果表明关联失败。解决方法是在中间添加如下代码
  您可以通过以上方式成功关联新浪微博。
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持九云大使。 查看全部

  新浪微博是利用feed找到更新文章的模板,成功关联
  新浪微博使用提要查找更新文章。只要给他指定feed地址,就可以成功关联。
  现在开始简单的修改织梦的模板。由于织梦无法生成整个站点的xml文件,所以我们首先要建立一个php程序,生成整个站点的xml。
  1、创建feed.php
  上面要注意的是修改模板的路径,保证在模板和目录下可以找到feed.htm
  2、创建feed.htm模板文件
  



{dede:global.cfg_webname/}
{dede:global.cfg_basehost/}
{dede:global.cfg_description/}
zh-cn
{dede:global.cfg_webname/}
{dede:global.cfg_adminemail/}
{dede:arclist row=&#39;60′ col=&#39;1′ titlelen=&#39;100′ orderby=&#39;pubdate&#39;}

[field:arcurl/]

[field:writer/]
[field:typename/]
[field:pubdate function=&#39;strftime("%a, %d %b %Y %H:%M:%S +0800",@me)&#39;/]
[field:arcurl/]


{/dede:arclist}


  请注意,不要忘记将我的 URL 更改为您需要的内容。
  3、修改index.htm首页模板
  由于新浪微博只能验证网址,无法写出完整路径。比如我写的是:。结果表明关联失败。解决方法是在中间添加如下代码
  您可以通过以上方式成功关联新浪微博。
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持九云大使。

基于新浪微博API开发的微博系统Xweibov2.0正式发布

网站优化优采云 发表了文章 • 0 个评论 • 85 次浏览 • 2021-08-17 00:30 • 来自相关话题

  基于新浪微博API开发的微博系统Xweibov2.0正式发布
  站长之家()5月4日消息:基于新浪微博API开发的免费开源微博系统Xweibo v2.0beta正式发布。
  
  Xweibo v2.0beta拥有新浪微博的核心功能,拥有微博发布、浏览、转发、评论、私信、采集、话题、黑名单等核心功能,还满足更多的运营需求:本地数据备份、从头设置网站迷/关注关系或继续使用新浪微博的关注关系、多个互动模块(包括活动、直播、现场采访)、信息评论后台、自定义短链接、个性化域名名称、模板自由选择、自定义皮肤、异地调用功能(微博展示单元、用户列表单元、互动话题单元、一键关注单元、群微博单元)等
  通过X微博,您可以与网站合作,获得类似于新浪微博的微博系统。开发者可以根据开发文档,基于X微博提供的微博系统进行二次开发。是Xweibo产品的开发者。
  微博的火爆让很多网站表达了他们对微博营销的乐观态度。但是,微博怎么搭建,网站怎么运营,大家都很困惑。 X微博2.0的出现解决了这些困惑,为网站提供了强大的微博系统和运营管理后台,可以让网站在微博运营市场中独树一帜,将在互联网微博上使用。在浪潮中获得更大的发展机遇。
  X微博系统拥有目前微博流行的多种丰富功能,并提供强大的运营管理后台,为客户提供全新的运营体验,方便微博运营商灵活运营,为终端用户提供新的微博平台。让网站与用户通过微博形成全方位互动。
  微博特点:
  账号互通,畅游微博世界
  高效的运营管理平台
  完善的内容审核,保障信息安全
  1、数据本地备份。
  2、六层信息安全审查机制:
  多版本
  WAP不需要设置,直接读取WEB管理后台设置。
  更多服务:
  1、Xweibo 免费托管服务:免费配置,免费服务器,宽带,一键安装,即可拥有自己的微博系统。
  2、 免费申请托管服务域名绑定。点击查看
  微博下载
  Xweibo v2.0 正式版下载
  
  
  界面预览 查看全部

  基于新浪微博API开发的微博系统Xweibov2.0正式发布
  站长之家()5月4日消息:基于新浪微博API开发的免费开源微博系统Xweibo v2.0beta正式发布。
  
  Xweibo v2.0beta拥有新浪微博的核心功能,拥有微博发布、浏览、转发、评论、私信、采集、话题、黑名单等核心功能,还满足更多的运营需求:本地数据备份、从头设置网站迷/关注关系或继续使用新浪微博的关注关系、多个互动模块(包括活动、直播、现场采访)、信息评论后台、自定义短链接、个性化域名名称、模板自由选择、自定义皮肤、异地调用功能(微博展示单元、用户列表单元、互动话题单元、一键关注单元、群微博单元)等
  通过X微博,您可以与网站合作,获得类似于新浪微博的微博系统。开发者可以根据开发文档,基于X微博提供的微博系统进行二次开发。是Xweibo产品的开发者。
  微博的火爆让很多网站表达了他们对微博营销的乐观态度。但是,微博怎么搭建,网站怎么运营,大家都很困惑。 X微博2.0的出现解决了这些困惑,为网站提供了强大的微博系统和运营管理后台,可以让网站在微博运营市场中独树一帜,将在互联网微博上使用。在浪潮中获得更大的发展机遇。
  X微博系统拥有目前微博流行的多种丰富功能,并提供强大的运营管理后台,为客户提供全新的运营体验,方便微博运营商灵活运营,为终端用户提供新的微博平台。让网站与用户通过微博形成全方位互动。
  微博特点:
  账号互通,畅游微博世界
  高效的运营管理平台
  完善的内容审核,保障信息安全
  1、数据本地备份。
  2、六层信息安全审查机制:
  多版本
  WAP不需要设置,直接读取WEB管理后台设置。
  更多服务:
  1、Xweibo 免费托管服务:免费配置,免费服务器,宽带,一键安装,即可拥有自己的微博系统。
  2、 免费申请托管服务域名绑定。点击查看
  微博下载
  Xweibo v2.0 正式版下载
  
  
  界面预览

QQ登录腾讯开放平台,创建一个应用,获取APP_KEY

网站优化优采云 发表了文章 • 0 个评论 • 419 次浏览 • 2021-08-15 22:13 • 来自相关话题

  QQ登录腾讯开放平台,创建一个应用,获取APP_KEY
  一、登录
  1、登录腾讯开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  3、下载iOS SDK环境设置
  1、导入SDK,配置项目
  1、SDK下载到本地后,将SDK拖入项目
  
  2、添加需要的依赖库
  Security.framework
SystemConfiguration.framework
CoreGraphics.Framework
CoreTelephony.framework
libiconv.tdb
libsqlite3.tdb
libstdc++.tdb
libz.tdb
  3、在项目配置的“Build Settings”栏中找到“Linking”配置区,在“Other Linker Flags”配置项中添加属性值“-fobjc-arc”
  
  2、添加项目代码
  1、添加网址方案,新方案=腾讯+appid。
  
  2、在plist文件中设置ATS
  
  3、在plist文件中添加白名单
  LSApplicationQueriesSchemes
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
  添加后如下图:
  
  2、在 AppDelegate.m 中添加代码:
  #import "AppDelegate.h"
#import
#import
@interface AppDelegate ()
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
//设置应用需要用户授权的API列表
NSArray *_permissions = [NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil];
//调用SDK登录
[_tencentOAuth authorize:_permissions inSafari:NO];
[_tencentOAuth accessToken] ;
[_tencentOAuth openId] ;
return YES;
}
//登录成功
- (void)tencentDidLogin
{
NSLog(@"登录完成");
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]) {
// 记录登录用户的OpenID、Token以及过期时间
NSLog(@"%@",_tencentOAuth.accessToken);
} else {
NSLog(@"登录不成功 没有获取accesstoken");
}
}
//非网络错误导致登录失败
-(void)tencentDidNotLogin:(BOOL)cancelled
{
if (cancelled) {
NSLog(@"用户取消登录");
} else {
NSLog(@"登录失败");
}
}
//网络错误导致登录失败
-(void)tencentDidNotNetWork
{
NSLog(@"无网络连接,请设置网络");
}
// 处理来至QQ的请求
- (void)onReq:(QQBaseReq *)req{
NSLog(@" ----req %@",req);
}
//处理来至QQ的响应
- (void)onResp:(QQBaseResp *)resp{
NSLog(@" ----resp %@",resp);
}
//处理QQ在线状态的回调
- (void)isOnlineResponse:(NSDictionary *)response{
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [TencentOAuth HandleOpenURL:url];}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [TencentOAuth HandleOpenURL:url];
}
  效果图:
  
  3、错误处理
  我在集成中遇到配置错误,如下图:
  
  解决方法:我在QQ开放平台注册了一个应用,获得了APPID,但是没有提交审核。有可能是未审核的APPID不可用(大概),可以换一个腾讯提供的APPID:222222。
  
   //初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
  演示下载
  这是两个地方,如果你设置正确,就是这样。
  二、微信登录
  1、登录微信开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  1、导入SDK,配置项目
  1、将下载的SDK拖入项目
  2、添加依赖库
  SystemConfiguration.framework
libz.tdb
libsqlite3.0.tdb
libc++.tdb
Security.framework
CoreTelephony.framework
CFNetwork.framework
  如果一些依赖库已经存在,则无需重复添加。
  3、在您的项目文件中选择构建设置,并在“其他链接器标志”中添加“-Objc -all_load”
  
  4、在Xcode中,选择你的项目设置,选择“TARGETS”栏,在“info”选项卡的“URL type”中添加“URL scheme”作为你注册的应用id。
  
  2、添加相关代码
  1、在 AppDelegate.m 中导入头文件
  #import "WXApi.h"
  2、添加协议:
  WXApiDelegate
  3、注册微信SDK:
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WXApi registerApp:@"wxd477edab60670232"];
return YES;
}
  4、页面跳转处理
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
  如果项目中集成了多个第三方登录,需要判断。
  5、发送请求微信登录
  在需要调用微信登录的按钮方法中添加如下代码:
   SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact"; // @"post_timeline,sns"
req.state = @"xxx";
[WXApi sendAuthReq:req viewController:self delegate:nil];
  效果图
  
  演示下载
  三、新浪微博登录
  1、登录新浪微博开放平台,创建应用,获取APPID和APPKEY。
  2、下载对应的SDK
  1、导入SDK,配置项目
  1、下载SDK后,将SDK拖入项目
  
  2、 项目中引入静态库后,编译时需要添加-ObjC,在Target->Build Settings->Linking下的Other Linker Flags中添加-ObjC。 (如果已经添加了就不用再添加了)
  3、添加依赖库(如果已经添加了一些依赖库,则无需再次添加)
  QuartzCore.framework
ImageIO.framework
SystemConfiguration.framework
Security.framework
CoreTelephony.framework
CoreText.framework
UIKit.framework
Foundation.framework
CoreGraphics.framework
libz.tdb
libsqlite3.tdb
  4、添加 URL Schemes
  
  2、添加相关代码
  在 AppDelegate.m 中添加头文件
  #import "WeiboSDK.h"
  添加协议
  WeiboSDKDelegate
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WeiboSDK registerApp:@"2045436852"];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
return YES;
}
  在需要调用新浪微博登录的按钮方法中添加代码:
   WBMessageObject *message = [WBMessageObject message];
message.text = @"测试使用";
WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message];
[WeiboSDK sendRequest:request];
  新浪微博登录需要真机测试。
  演示下载 查看全部

  QQ登录腾讯开放平台,创建一个应用,获取APP_KEY
  一、登录
  1、登录腾讯开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  3、下载iOS SDK环境设置
  1、导入SDK,配置项目
  1、SDK下载到本地后,将SDK拖入项目
  
  2、添加需要的依赖库
  Security.framework
SystemConfiguration.framework
CoreGraphics.Framework
CoreTelephony.framework
libiconv.tdb
libsqlite3.tdb
libstdc++.tdb
libz.tdb
  3、在项目配置的“Build Settings”栏中找到“Linking”配置区,在“Other Linker Flags”配置项中添加属性值“-fobjc-arc”
  
  2、添加项目代码
  1、添加网址方案,新方案=腾讯+appid。
  
  2、在plist文件中设置ATS
  
  3、在plist文件中添加白名单
  LSApplicationQueriesSchemes
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
  添加后如下图:
  
  2、在 AppDelegate.m 中添加代码:
  #import "AppDelegate.h"
#import
#import
@interface AppDelegate ()
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
//设置应用需要用户授权的API列表
NSArray *_permissions = [NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil];
//调用SDK登录
[_tencentOAuth authorize:_permissions inSafari:NO];
[_tencentOAuth accessToken] ;
[_tencentOAuth openId] ;
return YES;
}
//登录成功
- (void)tencentDidLogin
{
NSLog(@"登录完成");
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]) {
// 记录登录用户的OpenID、Token以及过期时间
NSLog(@"%@",_tencentOAuth.accessToken);
} else {
NSLog(@"登录不成功 没有获取accesstoken");
}
}
//非网络错误导致登录失败
-(void)tencentDidNotLogin:(BOOL)cancelled
{
if (cancelled) {
NSLog(@"用户取消登录");
} else {
NSLog(@"登录失败");
}
}
//网络错误导致登录失败
-(void)tencentDidNotNetWork
{
NSLog(@"无网络连接,请设置网络");
}
// 处理来至QQ的请求
- (void)onReq:(QQBaseReq *)req{
NSLog(@" ----req %@",req);
}
//处理来至QQ的响应
- (void)onResp:(QQBaseResp *)resp{
NSLog(@" ----resp %@",resp);
}
//处理QQ在线状态的回调
- (void)isOnlineResponse:(NSDictionary *)response{
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [TencentOAuth HandleOpenURL:url];}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [TencentOAuth HandleOpenURL:url];
}
  效果图:
  
  3、错误处理
  我在集成中遇到配置错误,如下图:
  
  解决方法:我在QQ开放平台注册了一个应用,获得了APPID,但是没有提交审核。有可能是未审核的APPID不可用(大概),可以换一个腾讯提供的APPID:222222。
  
   //初始化SDK
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222" andDelegate:self];
  演示下载
  这是两个地方,如果你设置正确,就是这样。
  二、微信登录
  1、登录微信开放平台,创建应用,获取APP_KEY和APP_ID
  2、下载对应的SDK
  
  1、导入SDK,配置项目
  1、将下载的SDK拖入项目
  2、添加依赖库
  SystemConfiguration.framework
libz.tdb
libsqlite3.0.tdb
libc++.tdb
Security.framework
CoreTelephony.framework
CFNetwork.framework
  如果一些依赖库已经存在,则无需重复添加。
  3、在您的项目文件中选择构建设置,并在“其他链接器标志”中添加“-Objc -all_load”
  
  4、在Xcode中,选择你的项目设置,选择“TARGETS”栏,在“info”选项卡的“URL type”中添加“URL scheme”作为你注册的应用id。
  
  2、添加相关代码
  1、在 AppDelegate.m 中导入头文件
  #import "WXApi.h"
  2、添加协议:
  WXApiDelegate
  3、注册微信SDK:
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WXApi registerApp:@"wxd477edab60670232"];
return YES;
}
  4、页面跳转处理
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
  如果项目中集成了多个第三方登录,需要判断。
  5、发送请求微信登录
  在需要调用微信登录的按钮方法中添加如下代码:
   SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact"; // @"post_timeline,sns"
req.state = @"xxx";
[WXApi sendAuthReq:req viewController:self delegate:nil];
  效果图
  
  演示下载
  三、新浪微博登录
  1、登录新浪微博开放平台,创建应用,获取APPID和APPKEY。
  2、下载对应的SDK
  1、导入SDK,配置项目
  1、下载SDK后,将SDK拖入项目
  
  2、 项目中引入静态库后,编译时需要添加-ObjC,在Target->Build Settings->Linking下的Other Linker Flags中添加-ObjC。 (如果已经添加了就不用再添加了)
  3、添加依赖库(如果已经添加了一些依赖库,则无需再次添加)
  QuartzCore.framework
ImageIO.framework
SystemConfiguration.framework
Security.framework
CoreTelephony.framework
CoreText.framework
UIKit.framework
Foundation.framework
CoreGraphics.framework
libz.tdb
libsqlite3.tdb
  4、添加 URL Schemes
  
  2、添加相关代码
  在 AppDelegate.m 中添加头文件
  #import "WeiboSDK.h"
  添加协议
  WeiboSDKDelegate
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WeiboSDK registerApp:@"2045436852"];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url scheme] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if([[url scheme] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
} else if([[url scheme] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
} else {
return [WeiboSDK handleOpenURL:url delegate:self];
}
return YES;
}
  在需要调用新浪微博登录的按钮方法中添加代码:
   WBMessageObject *message = [WBMessageObject message];
message.text = @"测试使用";
WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message];
[WeiboSDK sendRequest:request];
  新浪微博登录需要真机测试。
  演示下载

博客回复改版的事件、研究了新浪的web.api成功调用的新浪表情组件

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-08-15 22:09 • 来自相关话题

  博客回复改版的事件、研究了新浪的web.api成功调用的新浪表情组件
  最近在准备博客响应事件改版,研究了新浪的web.api调用成功的新浪表情组件
  来和大家分享一个很实用的东西,希望对大家有帮助
  我们先来看看操作的结果。
  
  是不是很刺眼?让我们来看看如何实现它。
  JS自定义hashtable代码如下
  //自定义hashtable
function Hashtable() {
this._hash = new Object();
this.put = function(key, value) {
if (typeof (key) != "undefined") {
if (this.containsKey(key) == false) {
this._hash[key] = typeof (value) == "undefined" ? null : value;
return true;
} else {
return false;
}
} else {
return false;
}
}
this.remove = function(key) { delete this._hash[key]; }
this.size =
function() { var i = 0; for (var k in this._hash) { i ; } return i; }
this.get = function(key) { return this._hash[key]; }
this.containsKey =
function(key) { return typeof (this._hash[key]) != "undefined"; }
this.clear =
function() { for (var k in this._hash) { delete this._hash[k]; } }
}
  初始化缓存并只加载一次页面。
  $(function() {
$.ajax( {
dataType : ´json´,
url : ´json/jquery.sinaEmotion.json´,
success : function(response) {
var data = response.data;
for ( var i in data) {
if (data[i].category == ´´) {
data[i].category = ´默认´;
}
if (emotions[data[i].category] == undefined) {
emotions[data[i].category] = new Array();
categorys.push(data[i].category);
}
emotions[data[i].category].push( {
name : data[i].phrase,
icon : data[i].icon
});
uSinaEmotionsHt.put(data[i].phrase, data[i].icon);
}
}
});
});
  替换
  function AnalyticEmotion(s) {
if(typeof (s) != "undefined") {
var sArr = s.match(/[.*?]/g);
for(var i = 0; i < sArr.length; i ){
if(uSinaEmotionsHt.containsKey(sArr[i])) {
var reStr = "";
s = s.replace(sArr[i], reStr);
}
}
}
return s;
}
  显示类别
  function showCategorys(){
var page = arguments[0]?arguments[0]:0;
if(page < 0 || page >= categorys.length / 5){
return;
}
$(´#emotions .categorys´).html(´´);
cat_page = page;
for(var i = page * 5; i < (page 1) * 5 && i < categorys.length; i){
$(´#emotions .categorys´)
.append($(´´
categorys[i] ´´));
}
$(´#emotions .categorys a´).click(function(){
showEmotions($(this).text());
});
$(´#emotions .categorys a´).each(function(){
if($(this).text() == cat_current){
$(this).addClass(´current´);
}
});
}
  显示表情
  function showEmotions(){
var category = arguments[0]?arguments[0]:´默认´;
var page = arguments[1]?arguments[1] - 1:0;
$(´#emotions .containersina´).html(´´);
$(´#emotions .page´).html(´´);
cat_current = category;
for(var i = page * 72; i < (page 1) * 72 && i < emotions[category].length; i){
$(´#emotions .containersina´)
.append($(´´
emotions[category][i].icon ´´));
}
$(´#emotions .containersina a´).click(function(){
target.insertText($(this).attr(´title´));
$(´#emotions´).remove();
});
for(var i = 1; i < emotions[category].length / 72 1; i){
$(´#emotions .page´).append($(´´ i ´´));
}
$(´#emotions .page a´).click(function(){
showEmotions(category, $(this).text());
});
$(´#emotions .categorys a.current´).removeClass(´current´);
$(´#emotions .categorys a´).each(function(){
if($(this).text() == category){
$(this).addClass(´current´);
}
});
}
  HTML代码如下
  
JQuery新浪1630个表情插件(带解析方法)
完美兼容IE6 所有浏览器


<br />


<br />
  当然要在整个代码实现之前引入对应的JS和CSS文件,对应的文件在源码中
  最后给大家一个源码下载链接:密码​​:6xe9
  也有本地版本:密码:6s3r
  如果资源对你有帮助,浏览后收获很多,不妨,你的鼓励是我继续写博客的最大动力 查看全部

  博客回复改版的事件、研究了新浪的web.api成功调用的新浪表情组件
  最近在准备博客响应事件改版,研究了新浪的web.api调用成功的新浪表情组件
  来和大家分享一个很实用的东西,希望对大家有帮助
  我们先来看看操作的结果。
  
  是不是很刺眼?让我们来看看如何实现它。
  JS自定义hashtable代码如下
  //自定义hashtable
function Hashtable() {
this._hash = new Object();
this.put = function(key, value) {
if (typeof (key) != "undefined") {
if (this.containsKey(key) == false) {
this._hash[key] = typeof (value) == "undefined" ? null : value;
return true;
} else {
return false;
}
} else {
return false;
}
}
this.remove = function(key) { delete this._hash[key]; }
this.size =
function() { var i = 0; for (var k in this._hash) { i ; } return i; }
this.get = function(key) { return this._hash[key]; }
this.containsKey =
function(key) { return typeof (this._hash[key]) != "undefined"; }
this.clear =
function() { for (var k in this._hash) { delete this._hash[k]; } }
}
  初始化缓存并只加载一次页面。
  $(function() {
$.ajax( {
dataType : ´json´,
url : ´json/jquery.sinaEmotion.json´,
success : function(response) {
var data = response.data;
for ( var i in data) {
if (data[i].category == ´´) {
data[i].category = ´默认´;
}
if (emotions[data[i].category] == undefined) {
emotions[data[i].category] = new Array();
categorys.push(data[i].category);
}
emotions[data[i].category].push( {
name : data[i].phrase,
icon : data[i].icon
});
uSinaEmotionsHt.put(data[i].phrase, data[i].icon);
}
}
});
});
  替换
  function AnalyticEmotion(s) {
if(typeof (s) != "undefined") {
var sArr = s.match(/[.*?]/g);
for(var i = 0; i < sArr.length; i ){
if(uSinaEmotionsHt.containsKey(sArr[i])) {
var reStr = "";
s = s.replace(sArr[i], reStr);
}
}
}
return s;
}
  显示类别
  function showCategorys(){
var page = arguments[0]?arguments[0]:0;
if(page < 0 || page >= categorys.length / 5){
return;
}
$(´#emotions .categorys´).html(´´);
cat_page = page;
for(var i = page * 5; i < (page 1) * 5 && i < categorys.length; i){
$(´#emotions .categorys´)
.append($(´´
categorys[i] ´´));
}
$(´#emotions .categorys a´).click(function(){
showEmotions($(this).text());
});
$(´#emotions .categorys a´).each(function(){
if($(this).text() == cat_current){
$(this).addClass(´current´);
}
});
}
  显示表情
  function showEmotions(){
var category = arguments[0]?arguments[0]:´默认´;
var page = arguments[1]?arguments[1] - 1:0;
$(´#emotions .containersina´).html(´´);
$(´#emotions .page´).html(´´);
cat_current = category;
for(var i = page * 72; i < (page 1) * 72 && i < emotions[category].length; i){
$(´#emotions .containersina´)
.append($(´´
emotions[category][i].icon ´´));
}
$(´#emotions .containersina a´).click(function(){
target.insertText($(this).attr(´title´));
$(´#emotions´).remove();
});
for(var i = 1; i < emotions[category].length / 72 1; i){
$(´#emotions .page´).append($(´´ i ´´));
}
$(´#emotions .page a´).click(function(){
showEmotions(category, $(this).text());
});
$(´#emotions .categorys a.current´).removeClass(´current´);
$(´#emotions .categorys a´).each(function(){
if($(this).text() == category){
$(this).addClass(´current´);
}
});
}
  HTML代码如下
  
JQuery新浪1630个表情插件(带解析方法)
完美兼容IE6 所有浏览器


<br />


<br />
  当然要在整个代码实现之前引入对应的JS和CSS文件,对应的文件在源码中
  最后给大家一个源码下载链接:密码​​:6xe9
  也有本地版本:密码:6s3r
  如果资源对你有帮助,浏览后收获很多,不妨,你的鼓励是我继续写博客的最大动力

网站调用新浪微博图片管理模块会匹配出api接口地址

网站优化优采云 发表了文章 • 0 个评论 • 93 次浏览 • 2021-08-08 18:08 • 来自相关话题

  网站调用新浪微博图片管理模块会匹配出api接口地址
  网站调用新浪微博内容时,“图片管理”模块会匹配出url,会匹配出api接口地址,并不是匹配不出来。新浪微博支持多点对齐,所以一个httppost请求里可能包含多张图片;而百度爬虫对图片抓取有一定准则,所以不会抓取多张图片,而是抓取同一段url。
  网站对于页面js代码是否会做限制,
  一个httppost请求包含多张图片的话,url会匹配多个url。
  百度会直接一个请求包含一张图片,但imageurl还是从url返回。
  因为js,css,javascript文件不都是在http协议下请求网站么
  大家说的都是原理,然后具体实现如何,我们就是做这个的。我刚进入这行的时候有说ajax和http基本不兼容,然后发现谷歌还真的就支持,不过mathml和一些css还是需要去适配。至于为什么,可能是浏览器无响应或者某种原因?不是ie原因的话,我就不知道了。我对google已经丧失好感了,换其他了吧,不需要这么做来吸引流量。
  有时候,其实也可以缓解google流量。如果你可以这么说,可能他每年的营业额还没有google一年营业额多。你可以想象一下效果。
  手机看不到,
  不是有发现文章是说,发布的图片一些默认的尺寸比较大,可能是开了网页的gzip压缩。 查看全部

  网站调用新浪微博图片管理模块会匹配出api接口地址
  网站调用新浪微博内容时,“图片管理”模块会匹配出url,会匹配出api接口地址,并不是匹配不出来。新浪微博支持多点对齐,所以一个httppost请求里可能包含多张图片;而百度爬虫对图片抓取有一定准则,所以不会抓取多张图片,而是抓取同一段url。
  网站对于页面js代码是否会做限制,
  一个httppost请求包含多张图片的话,url会匹配多个url。
  百度会直接一个请求包含一张图片,但imageurl还是从url返回。
  因为js,css,javascript文件不都是在http协议下请求网站么
  大家说的都是原理,然后具体实现如何,我们就是做这个的。我刚进入这行的时候有说ajax和http基本不兼容,然后发现谷歌还真的就支持,不过mathml和一些css还是需要去适配。至于为什么,可能是浏览器无响应或者某种原因?不是ie原因的话,我就不知道了。我对google已经丧失好感了,换其他了吧,不需要这么做来吸引流量。
  有时候,其实也可以缓解google流量。如果你可以这么说,可能他每年的营业额还没有google一年营业额多。你可以想象一下效果。
  手机看不到,
  不是有发现文章是说,发布的图片一些默认的尺寸比较大,可能是开了网页的gzip压缩。

如何实现博客内容打开搜狗搜索引擎?(默认打开)

网站优化优采云 发表了文章 • 0 个评论 • 125 次浏览 • 2021-07-30 00:12 • 来自相关话题

  如何实现博客内容打开搜狗搜索引擎?(默认打开)
  网站调用新浪微博内容/源码,然后微博内容上网站提交。将网站上新浪微博网页链接嵌入进搜狗搜索(默认打开)进行抓取。
  在我看来,这个问题不是“如何实现微博网页打开谷歌搜索引擎”而是“如何实现博客内容打开搜狗搜索引擎”两者是不一样的两种技术架构(搜狗好像在积极想做这个功能)应该是有两种不同的标准方案:1.restfulapi方案可以这么理解,在浏览器调用,然后谷歌搜索、最后发布到谷歌搜索。优点:便于实现定制化不需要服务器,content-type也比较简单缺点:有可能会不正规(如使用第三方编辑)这种方案出来的网站多为内容站,服务器需要认证,像不像谷歌的no-content,no-all的网站。
  这类网站做转发之类的功能应该会存在大问题。2.php高级技术,如响应式等。使用方案a,获取微博网页的源代码,发布到restfulapi,然后进行定制化构建方案b,我不知道采用何种方案,应该是使用开放api接口传递你的网站上的源代码,然后由谷歌搜索技术人员对你的网站进行定制化构建。到这一步,你网站的内容,已经是根据你的指定的内容来进行定制化了,有可能是博客,有可能是电商,然后谷歌搜索出来,会根据关键词进行匹配,如果匹配到你的电商网站或者你的博客网站,就会抓取下来你的网站。也有可能没有匹配到,或者你的博客网站被窃取了数据。 查看全部

  如何实现博客内容打开搜狗搜索引擎?(默认打开)
  网站调用新浪微博内容/源码,然后微博内容上网站提交。将网站上新浪微博网页链接嵌入进搜狗搜索(默认打开)进行抓取。
  在我看来,这个问题不是“如何实现微博网页打开谷歌搜索引擎”而是“如何实现博客内容打开搜狗搜索引擎”两者是不一样的两种技术架构(搜狗好像在积极想做这个功能)应该是有两种不同的标准方案:1.restfulapi方案可以这么理解,在浏览器调用,然后谷歌搜索、最后发布到谷歌搜索。优点:便于实现定制化不需要服务器,content-type也比较简单缺点:有可能会不正规(如使用第三方编辑)这种方案出来的网站多为内容站,服务器需要认证,像不像谷歌的no-content,no-all的网站。
  这类网站做转发之类的功能应该会存在大问题。2.php高级技术,如响应式等。使用方案a,获取微博网页的源代码,发布到restfulapi,然后进行定制化构建方案b,我不知道采用何种方案,应该是使用开放api接口传递你的网站上的源代码,然后由谷歌搜索技术人员对你的网站进行定制化构建。到这一步,你网站的内容,已经是根据你的指定的内容来进行定制化了,有可能是博客,有可能是电商,然后谷歌搜索出来,会根据关键词进行匹配,如果匹配到你的电商网站或者你的博客网站,就会抓取下来你的网站。也有可能没有匹配到,或者你的博客网站被窃取了数据。

使用python抓取一个人的所有信息_Python抓取新浪微博用户信息和内容

网站优化优采云 发表了文章 • 0 个评论 • 256 次浏览 • 2021-07-29 04:00 • 来自相关话题

  使用python抓取一个人的所有信息_Python抓取新浪微博用户信息和内容
  目标
  爬取新浪微博用户数据,包括以下字段:id、昵称、粉丝数、粉丝数、微博数、每条微博的内容、转发数、评论数、点赞数、发布时间、来源,无论是原创 还是转贴。 (本文以GUCCI为例)
  方法
  +使用 selenium 模拟爬虫
  +使用 BeautifulSoup 解析 HTML
  结果显示
  
  步骤分解
  1.选择抓取目标网址
  首先,在准备开始抓取之前,您必须弄清楚要抓取哪个网址。新浪微博网站分为网页版和手机版两种。大部分微博数据抓取都会选择抓取移动端,因为相比之下,移动端基本收录了你想要的所有数据,而移动端相对PC端轻量。
  以下是GUCCI手机端和PC端的网页展示。
  
  2.模拟登录
  设置好抓取微博手机数据后,就可以模拟登录了。
  模拟登录网址
  登陆页面的外观
  
  模拟登录代码
  
  
  3.获取用户微博页码
  登录后,您可以输入您要抓取的商家信息。因为每个商家的微博数量不同,对应的微博页码也不同。这里先抓取商家的微博页码。同时,爬取那些公开的信息,比如用户uid、用户名、微博数、关注数、粉丝数。
  
  4.根据最大爬取页数循环爬取所有数据
  得到最大页数后,直接通过循环抓取每一页数据。抓取到的数据包括微博内容、转发数、评论数、点赞数、发微博时间、微博来源,以及是原创还是转发。
  
  
  4.得到所有数据后,可以写入csv文件或者excel,最终结果会显示在上面
  文章来解决完整的微博爬虫!
  最后想一起学python和爬虫的可以来我的python学习裙【784758214】,里面有安装
  包和学习视频资料免费分享,朋友在里面交流,每天分享一些学习方法和需要注意的小细节
  我也会按时讲一些实际的项目案例。
  点击:加入 查看全部

  使用python抓取一个人的所有信息_Python抓取新浪微博用户信息和内容
  目标
  爬取新浪微博用户数据,包括以下字段:id、昵称、粉丝数、粉丝数、微博数、每条微博的内容、转发数、评论数、点赞数、发布时间、来源,无论是原创 还是转贴。 (本文以GUCCI为例)
  方法
  +使用 selenium 模拟爬虫
  +使用 BeautifulSoup 解析 HTML
  结果显示
  
  步骤分解
  1.选择抓取目标网址
  首先,在准备开始抓取之前,您必须弄清楚要抓取哪个网址。新浪微博网站分为网页版和手机版两种。大部分微博数据抓取都会选择抓取移动端,因为相比之下,移动端基本收录了你想要的所有数据,而移动端相对PC端轻量。
  以下是GUCCI手机端和PC端的网页展示。
  
  2.模拟登录
  设置好抓取微博手机数据后,就可以模拟登录了。
  模拟登录网址
  登陆页面的外观
  
  模拟登录代码
  
  
  3.获取用户微博页码
  登录后,您可以输入您要抓取的商家信息。因为每个商家的微博数量不同,对应的微博页码也不同。这里先抓取商家的微博页码。同时,爬取那些公开的信息,比如用户uid、用户名、微博数、关注数、粉丝数。
  
  4.根据最大爬取页数循环爬取所有数据
  得到最大页数后,直接通过循环抓取每一页数据。抓取到的数据包括微博内容、转发数、评论数、点赞数、发微博时间、微博来源,以及是原创还是转发。
  
  
  4.得到所有数据后,可以写入csv文件或者excel,最终结果会显示在上面
  文章来解决完整的微博爬虫!
  最后想一起学python和爬虫的可以来我的python学习裙【784758214】,里面有安装
  包和学习视频资料免费分享,朋友在里面交流,每天分享一些学习方法和需要注意的小细节
  我也会按时讲一些实际的项目案例。
  点击:加入

使用Selenium爬取动态网页为例-新浪微博网站解析

网站优化优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2021-07-24 02:01 • 来自相关话题

  使用Selenium爬取动态网页为例-新浪微博网站解析
  今天我们将使用Selenium来抓取动态网页,以新浪微博网站为例。我们需要通过以下三个步骤进行抓取:
  登录新浪微博网站分析微博网站页面定期重新打开微博首页,抓取最新微博或拉动滚动条抓取更多以前的微博
  代码如下
  # -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date: 2019-09-24 16:20
# # @Last Modified by: lemon
# # @Last Modified time: 2019-09-24 19:12
# # @function: 爬取新浪微博网站
from selenium import webdriver
import time
import pandas as pd
import hashlib # 摘要算法(哈希算法)包
# 创建 data 用来存储
def create_frame():
data = {
&#39;用户_id&#39;: [],
&#39;用户_url&#39;: [],
&#39;微博内容&#39;: []
}
return data
# 写入data
def data_writer(pub_id, pub_url, pub_content):
data[&#39;用户_id&#39;].append(pub_id)
data[&#39;用户_url&#39;].append(pub_url)
data[&#39;微博内容&#39;].append(pub_content)
# 保存文件
def data_save():
frame = pd.DataFrame(data)
frame.to_excel(&#39;微博用户数据.xlsx&#39;)
# 登录微博
def login():
driver.get(&#39;https://weibo.com&#39;)
time.sleep(5)
driver.set_window_size(1920, 1080) # 设置浏览器大小
username = driver.find_element_by_xpath(&#39;//*[@id="loginname"]&#39;) # 用户名输入框
username.send_keys(&#39;lemon_of_sun@sina.com&#39;) # 发送账号
password = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input&#39;) # 密码输入框
password.send_keys(&#39;sunxusen2020&#39;) # 发送密码
submit = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[6]&#39;) # 登录按钮
print(&#39;准备登录...&#39;)
submit.click() # 点击登录按钮
time.sleep(4) # 停止 4s , 确保已成功切入后续页面
# 抓取页面
def spider():
driver.get(&#39;https://www.weibo.com&#39;) # 刷新微博网站首页
print(&#39;已登录...&#39;)
# 先获取页面中所有微博代码段, 然后使用循环从每一段中提取数据
all_weibo = driver.find_elements_by_xpath(&#39;//*[@class="WB_feed_detail clearfix"]&#39;)
for weibo in all_weibo:
pub_id = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].text # 解析出微博用户 id
pub_url = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].get_attribute(&#39;href&#39;) # 解析出发布者 URL
try:
pub_content = weibo.find_elements_by_xpath(&#39;div[3]/div[4]&#39;)[0].text
except:
print(f&#39;{pub_id} : 无内容&#39;)
pub_content = &#39;无内容&#39;
pass
hash_content = hashlib.md5(pub_content.encode(&#39;utf-8&#39;)).hexdigest() # 计算微博内容的 MD5 值
if hash_content not in is_dup:
print(f&#39;成功抓取 : {pub_id}&#39;)
data_writer(pub_id, pub_url, pub_content)
is_dup.add(hash_content)
if __name__ == &#39;__main__&#39;:
is_dup = set() # 创建一个空的 set, 用来去重
data = create_frame()
driver = webdriver.Chrome(&#39;E:\ChromeDriver\chromedriver.exe&#39;)
login()
for i in range(3):
spider()
time.sleep(10)
data_save()
  上述代码中使用了重复数据删除功能。在爬取的过程中,我们可能会爬取之前已经爬取过的数据。这时候我们就需要进行去重。我们使用最常见的集合数据结构进行重复数据删除。我们使用微博内容进行去重判断,可以直接将抓取到的内容加入集合中。不过因为一般微博内容比较多,直接使用会占用大量内存,影响爬虫效率。下面我们使用摘要算法(也称为哈希算法),它通过一个函数将任意长度的数据转换为固定长度的数据串。微博内容是一个很长的字符串。使用摘要算法将得到一个固定长度的摘要。如果一段时间后再次爬取这条微博,使用digest算法得到相同的digest;如果再次抓取微博的内容发生了变化,计算出来的摘要会与原微博的摘要不同。
  下面以最常见的MD5摘要算法为例,计算一个字符串的MD5值。这里需要导入hashlib。 Hashlib 是一个 Python 标准库,提供了一些流行的哈希算法。有兴趣的朋友可以研究一下。
  def MD5_example():
str_md5 = hashlib.md5(&#39;life is short you need python&#39;.encode(&#39;utf-8&#39;)).hexdigest()
print(str_md5)
  输出如下:
  
  注意:在使用MD5算法计算摘要之前,需要将字符串编码成二进制形式。 查看全部

  使用Selenium爬取动态网页为例-新浪微博网站解析
  今天我们将使用Selenium来抓取动态网页,以新浪微博网站为例。我们需要通过以下三个步骤进行抓取:
  登录新浪微博网站分析微博网站页面定期重新打开微博首页,抓取最新微博或拉动滚动条抓取更多以前的微博
  代码如下
  # -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date: 2019-09-24 16:20
# # @Last Modified by: lemon
# # @Last Modified time: 2019-09-24 19:12
# # @function: 爬取新浪微博网站
from selenium import webdriver
import time
import pandas as pd
import hashlib # 摘要算法(哈希算法)包
# 创建 data 用来存储
def create_frame():
data = {
&#39;用户_id&#39;: [],
&#39;用户_url&#39;: [],
&#39;微博内容&#39;: []
}
return data
# 写入data
def data_writer(pub_id, pub_url, pub_content):
data[&#39;用户_id&#39;].append(pub_id)
data[&#39;用户_url&#39;].append(pub_url)
data[&#39;微博内容&#39;].append(pub_content)
# 保存文件
def data_save():
frame = pd.DataFrame(data)
frame.to_excel(&#39;微博用户数据.xlsx&#39;)
# 登录微博
def login():
driver.get(&#39;https://weibo.com&#39;)
time.sleep(5)
driver.set_window_size(1920, 1080) # 设置浏览器大小
username = driver.find_element_by_xpath(&#39;//*[@id="loginname"]&#39;) # 用户名输入框
username.send_keys(&#39;lemon_of_sun@sina.com&#39;) # 发送账号
password = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input&#39;) # 密码输入框
password.send_keys(&#39;sunxusen2020&#39;) # 发送密码
submit = driver.find_element_by_xpath(&#39;//*[@id="pl_login_form"]/div/div[3]/div[6]&#39;) # 登录按钮
print(&#39;准备登录...&#39;)
submit.click() # 点击登录按钮
time.sleep(4) # 停止 4s , 确保已成功切入后续页面
# 抓取页面
def spider():
driver.get(&#39;https://www.weibo.com&#39;) # 刷新微博网站首页
print(&#39;已登录...&#39;)
# 先获取页面中所有微博代码段, 然后使用循环从每一段中提取数据
all_weibo = driver.find_elements_by_xpath(&#39;//*[@class="WB_feed_detail clearfix"]&#39;)
for weibo in all_weibo:
pub_id = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].text # 解析出微博用户 id
pub_url = weibo.find_elements_by_xpath(&#39;div[3]/div[1]/a[1]&#39;)[0].get_attribute(&#39;href&#39;) # 解析出发布者 URL
try:
pub_content = weibo.find_elements_by_xpath(&#39;div[3]/div[4]&#39;)[0].text
except:
print(f&#39;{pub_id} : 无内容&#39;)
pub_content = &#39;无内容&#39;
pass
hash_content = hashlib.md5(pub_content.encode(&#39;utf-8&#39;)).hexdigest() # 计算微博内容的 MD5 值
if hash_content not in is_dup:
print(f&#39;成功抓取 : {pub_id}&#39;)
data_writer(pub_id, pub_url, pub_content)
is_dup.add(hash_content)
if __name__ == &#39;__main__&#39;:
is_dup = set() # 创建一个空的 set, 用来去重
data = create_frame()
driver = webdriver.Chrome(&#39;E:\ChromeDriver\chromedriver.exe&#39;)
login()
for i in range(3):
spider()
time.sleep(10)
data_save()
  上述代码中使用了重复数据删除功能。在爬取的过程中,我们可能会爬取之前已经爬取过的数据。这时候我们就需要进行去重。我们使用最常见的集合数据结构进行重复数据删除。我们使用微博内容进行去重判断,可以直接将抓取到的内容加入集合中。不过因为一般微博内容比较多,直接使用会占用大量内存,影响爬虫效率。下面我们使用摘要算法(也称为哈希算法),它通过一个函数将任意长度的数据转换为固定长度的数据串。微博内容是一个很长的字符串。使用摘要算法将得到一个固定长度的摘要。如果一段时间后再次爬取这条微博,使用digest算法得到相同的digest;如果再次抓取微博的内容发生了变化,计算出来的摘要会与原微博的摘要不同。
  下面以最常见的MD5摘要算法为例,计算一个字符串的MD5值。这里需要导入hashlib。 Hashlib 是一个 Python 标准库,提供了一些流行的哈希算法。有兴趣的朋友可以研究一下。
  def MD5_example():
str_md5 = hashlib.md5(&#39;life is short you need python&#39;.encode(&#39;utf-8&#39;)).hexdigest()
print(str_md5)
  输出如下:
  
  注意:在使用MD5算法计算摘要之前,需要将字符串编码成二进制形式。

链接源头文字的写作需要和指向页的内容相关性

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-07-15 23:59 • 来自相关话题

  链接源头文字的写作需要和指向页的内容相关性
  亚历克斯
  Alexa是亚马逊公司下属的网站,用于估算网站在全球各个国家的总流量,以确定网站的受欢迎程度。它给网站 一个统一的排名。 Alexa值越小,排名越高,网站的流量越大。但是,这些数据只能作为参考。由于是第三方估算,无法直接获取流量数据,且其给出的流量数据并没有以Alexa工具栏的用户为依据,给出的流量数据相当夸张或压缩,因此没有真正的测量。 网站 性能特点。 网站 的实际表现取决于网站 自己独立的统计系统的数据,Alexa 无法使用这些数据。 Alexa数据对搜索引擎优化没有参考价值。
  算法算法
  算法是为解决问题而形成的公式。在搜索引擎中,算法是程序员编写的一套程序,用于自动分析网站的内容、结构和相关性,以确定网站的质量和价值,并为关键词的排名提供依据搜索结果。
  锚文本链接源文本
  链接的源文本是网页中由一行突出显示的一段文本,用于指示指向另一个网页的链接的描述。点击此文字,浏览器会调出此文字后的目标,即另一个网页。链接源文本的编写需要与指向页面的内容相关联,以便访问者能够简洁明了地介绍指向页面。链接源文本的编写对提升网站PR的价值有重要作用 查看全部

  链接源头文字的写作需要和指向页的内容相关性
  亚历克斯
  Alexa是亚马逊公司下属的网站,用于估算网站在全球各个国家的总流量,以确定网站的受欢迎程度。它给网站 一个统一的排名。 Alexa值越小,排名越高,网站的流量越大。但是,这些数据只能作为参考。由于是第三方估算,无法直接获取流量数据,且其给出的流量数据并没有以Alexa工具栏的用户为依据,给出的流量数据相当夸张或压缩,因此没有真正的测量。 网站 性能特点。 网站 的实际表现取决于网站 自己独立的统计系统的数据,Alexa 无法使用这些数据。 Alexa数据对搜索引擎优化没有参考价值。
  算法算法
  算法是为解决问题而形成的公式。在搜索引擎中,算法是程序员编写的一套程序,用于自动分析网站的内容、结构和相关性,以确定网站的质量和价值,并为关键词的排名提供依据搜索结果。
  锚文本链接源文本
  链接的源文本是网页中由一行突出显示的一段文本,用于指示指向另一个网页的链接的描述。点击此文字,浏览器会调出此文字后的目标,即另一个网页。链接源文本的编写需要与指向页面的内容相关联,以便访问者能够简洁明了地介绍指向页面。链接源文本的编写对提升网站PR的价值有重要作用

代码去爬去新浪微博的登陆操作心得(二)

网站优化优采云 发表了文章 • 0 个评论 • 96 次浏览 • 2021-07-15 23:49 • 来自相关话题

  代码去爬去新浪微博的登陆操作心得(二)
  概述:
  由于业务需要,需要编写爬虫代码来爬取新浪微博用户的信息。
  虽然网上可以查到很多资料,但由于新浪微博的改版和登录机制的修改,很多老的文章不适合使用。
  经过一番摸索,成功模拟了新浪微博的登录操作。该项目使用 Javascript 语言并在 Chrome 扩展程序中运行。和大家分享一下过程和经验。
  请注意,这篇文章是在 2013.08.16 写的。由于微博业务变化频繁,随着时间的推移,文章可能不再适用。
  正文:探索的过程
  1.了解大致流程
  登录微博,使用fiddler工具监听http请求,拦截如下操作:
  
  可以看到,在整个微博登录过程中,有四个重要的HTTP请求,分别是:
  (1) GET /sso/prelogin.php
  (2) POST /sso/login.php
  (3) GET /ajaxlogin.php
  (4) GET /u/2813262187
  其中,sso是单点登录
  (1)是登录前的预处理,名字很明显--pre。这一步主要是获取几个重要的参数,作为下一个POST表单的参数。
  可以在浏览器中访问请求地址查看返回结果:
  (v1.4.11)
  结果如下:
  1sinaSSOController.preloginCallBack({"retcode":0,
  2"servertime":1376533839,
  3"pcid":"gz-7bdd82b8980057a8bbc1f86b21d5a86184dd",
  4"nonce":"R1KGHZ",
  5 “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”,
  6"rsakv":"1330428213",
  7"exectime":2})
  返回的数据包括servertime:服务时间戳,nonce:6位随机码,pubkey:用于rsa2密码加密的公钥,rsakv:显然也用于加密。
  这四个值都是下一步需要用到的。
  在长版的新浪微博登录机制中,使用的是sha加密方式,没有pubkey和rsakv参数,
  所以网上看到的2012年爬虫代码模拟登录的代码已经不适合使用了,但是整体逻辑变化不大。只需稍加修改即可使用。我就是这样来到这里的。 , 撞墙无数=.=
  给两个参考文章:
  对于 Python
  对于 PHP
  (2)提交表单的操作,我们还是检查HTTP请求和表单内容
  
  我看到了,servertime、nonce、rsakv 和 su:加密的用户名,sp:加密的密码。现在的问题是用户名和密码是如何加密的,这样我们就可以轻松关注js代码了
  请求新浪登录页面:有密码加密的js代码,
  里面的代码是加密的。找个工具解密(),基本看不到里面的逻辑。
  (3)解析ssologin.js
  既然知道servertime和nonce是用来加密的,那我们不妨在文件中搜索这两个关键字,一搜发现好东西:
  
  回到上面看看,form里面有su和sp,都在这里,可以看到su使用了base64加密;而 su 有点复杂,
  if中的代码是新浪当前版本的密码加密方式rsa2的代码,else中的代码是版本sha加密的代码,我们只需要关心if中的内容,
  加密过程很简单,先生成一个RSAKey对象,设置PublicKey,然后加密。
  一一推回去,就可以知道最后一步加密的最后一个参数ag就是原来的密码值了,就不会眼花缭乱了~
  总而言之,以pubkey和10001的长字符串为参数调用setPublic()。注意它们都是十六进制数;然后使用 (servertime + nonce + pwd) 作为参数调用 Encrypt()。 .
  我们来看看sinaSSOEncoder是什么。它的定义在解密代码的第 1118 行。从这里开始,我们将截取到文件的末尾,我们自己使用。
  1}).call(sinaSSOEncoder);
  2//sinaSSOController=newSSOController();
  3//sinaSSOController.init();
  这样就解决了密码加密的问题。
  2. 模拟请求过程
  既然知道了大体原理,就可以开始模拟整个登录过程了,
  (1) GET 请求(v1.4.11)
  在返回的数据中,servertime、nonce和rsakv是有规律匹配的。请注意,请求时也必须将时间戳发送到服务器。我们来看看fiddler监听的QueryString:
  
  前五个参数都是在URL中显示和声明的,最后一个_是在发送请求的时候加上并传递过来的。
  我正在使用Javascript,使用Jquery,只需将其添加到$.ajax 中的数据属性即可。
  (2)POST 请求(v1.4.11)提交登录表单
  1 个代理('(v1.4.11)',
  2{type:'POST',headers:{Referer:'#39;},
  3 数据:{
  4entry:'微博',
  5gateway:1,
  6from:'',
  7savestate:7,
  8useticket:1,
  9pagerefer:'#39;,
  10vsnf:1,
  11 su:'MTgxMDU0MjMzNyU0MHFxLmNvbQ==',
  12service:'miniblog',
  13 服务器时间:服务器时间,
  14 nonce:nonce,
  15pwencode:'rsa2',
  16 rsakv:rsakv,
  17 sp:sp,
  18encoding:'UTF-8',
  19prelt:505,
  20url:'#39;,
  21returntype:'META'
  22}
  23}, function(err,data){ ...});
  Agent 是一个封装模块,用于发送请求事务。重点看里面的数据对象,其中su是base64加密的用户名,每次调用都是固定的,所以这里不好写;
  servertime、nonce、rsakv都是上一步截取的;
  sp是加密后的密码,可以参考上面的加密方法获得。 查看全部

  代码去爬去新浪微博的登陆操作心得(二)
  概述:
  由于业务需要,需要编写爬虫代码来爬取新浪微博用户的信息。
  虽然网上可以查到很多资料,但由于新浪微博的改版和登录机制的修改,很多老的文章不适合使用。
  经过一番摸索,成功模拟了新浪微博的登录操作。该项目使用 Javascript 语言并在 Chrome 扩展程序中运行。和大家分享一下过程和经验。
  请注意,这篇文章是在 2013.08.16 写的。由于微博业务变化频繁,随着时间的推移,文章可能不再适用。
  正文:探索的过程
  1.了解大致流程
  登录微博,使用fiddler工具监听http请求,拦截如下操作:
  
  可以看到,在整个微博登录过程中,有四个重要的HTTP请求,分别是:
  (1) GET /sso/prelogin.php
  (2) POST /sso/login.php
  (3) GET /ajaxlogin.php
  (4) GET /u/2813262187
  其中,sso是单点登录
  (1)是登录前的预处理,名字很明显--pre。这一步主要是获取几个重要的参数,作为下一个POST表单的参数。
  可以在浏览器中访问请求地址查看返回结果:
  (v1.4.11)
  结果如下:
  1sinaSSOController.preloginCallBack({"retcode":0,
  2"servertime":1376533839,
  3"pcid":"gz-7bdd82b8980057a8bbc1f86b21d5a86184dd",
  4"nonce":"R1KGHZ",
  5 “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”,
  6"rsakv":"1330428213",
  7"exectime":2})
  返回的数据包括servertime:服务时间戳,nonce:6位随机码,pubkey:用于rsa2密码加密的公钥,rsakv:显然也用于加密。
  这四个值都是下一步需要用到的。
  在长版的新浪微博登录机制中,使用的是sha加密方式,没有pubkey和rsakv参数,
  所以网上看到的2012年爬虫代码模拟登录的代码已经不适合使用了,但是整体逻辑变化不大。只需稍加修改即可使用。我就是这样来到这里的。 , 撞墙无数=.=
  给两个参考文章:
  对于 Python
  对于 PHP
  (2)提交表单的操作,我们还是检查HTTP请求和表单内容
  
  我看到了,servertime、nonce、rsakv 和 su:加密的用户名,sp:加密的密码。现在的问题是用户名和密码是如何加密的,这样我们就可以轻松关注js代码了
  请求新浪登录页面:有密码加密的js代码,
  里面的代码是加密的。找个工具解密(),基本看不到里面的逻辑。
  (3)解析ssologin.js
  既然知道servertime和nonce是用来加密的,那我们不妨在文件中搜索这两个关键字,一搜发现好东西:
  
  回到上面看看,form里面有su和sp,都在这里,可以看到su使用了base64加密;而 su 有点复杂,
  if中的代码是新浪当前版本的密码加密方式rsa2的代码,else中的代码是版本sha加密的代码,我们只需要关心if中的内容,
  加密过程很简单,先生成一个RSAKey对象,设置PublicKey,然后加密。
  一一推回去,就可以知道最后一步加密的最后一个参数ag就是原来的密码值了,就不会眼花缭乱了~
  总而言之,以pubkey和10001的长字符串为参数调用setPublic()。注意它们都是十六进制数;然后使用 (servertime + nonce + pwd) 作为参数调用 Encrypt()。 .
  我们来看看sinaSSOEncoder是什么。它的定义在解密代码的第 1118 行。从这里开始,我们将截取到文件的末尾,我们自己使用。
  1}).call(sinaSSOEncoder);
  2//sinaSSOController=newSSOController();
  3//sinaSSOController.init();
  这样就解决了密码加密的问题。
  2. 模拟请求过程
  既然知道了大体原理,就可以开始模拟整个登录过程了,
  (1) GET 请求(v1.4.11)
  在返回的数据中,servertime、nonce和rsakv是有规律匹配的。请注意,请求时也必须将时间戳发送到服务器。我们来看看fiddler监听的QueryString:
  
  前五个参数都是在URL中显示和声明的,最后一个_是在发送请求的时候加上并传递过来的。
  我正在使用Javascript,使用Jquery,只需将其添加到$.ajax 中的数据属性即可。
  (2)POST 请求(v1.4.11)提交登录表单
  1 个代理('(v1.4.11)',
  2{type:'POST',headers:{Referer:'#39;},
  3 数据:{
  4entry:'微博',
  5gateway:1,
  6from:'',
  7savestate:7,
  8useticket:1,
  9pagerefer:'#39;,
  10vsnf:1,
  11 su:'MTgxMDU0MjMzNyU0MHFxLmNvbQ==',
  12service:'miniblog',
  13 服务器时间:服务器时间,
  14 nonce:nonce,
  15pwencode:'rsa2',
  16 rsakv:rsakv,
  17 sp:sp,
  18encoding:'UTF-8',
  19prelt:505,
  20url:'#39;,
  21returntype:'META'
  22}
  23}, function(err,data){ ...});
  Agent 是一个封装模块,用于发送请求事务。重点看里面的数据对象,其中su是base64加密的用户名,每次调用都是固定的,所以这里不好写;
  servertime、nonce、rsakv都是上一步截取的;
  sp是加密后的密码,可以参考上面的加密方法获得。

官方客服QQ群

微信人工客服

QQ人工客服


线