在Google這個由10的100次方得名的站點中,各種評估網站的算法層出不窮,而PageRank即是其中之一。
Google的PageRank根據網站的外部鏈接和內部鏈接的數量和質量倆衡量網站的價值。PageRank背后的概念是,每個到頁面的鏈接都是對該頁面的一次投票,被鏈接的越多,就意味著被其他網站投票越多。這個就是所謂的“鏈接流行度”——衡量多少人愿意將他們的網站和你的網站掛鉤。PageRank這個概念引自學術中一篇論文的被引述的頻度——即被別人引述的次數越多,一般判斷這篇論文的權威性就越高。
通常情況下講,原創內容越多的站點,PageRank越容易提升,反之則相對比較困難,PageRank最大上限值為10。在Google的評估中,能上10的網站真可謂鳳毛麟角,即使算上Google,能成就PageRank 10這“偉業”者,望眼環球也不足40家。一般來說,個人站點評估值4即辦的不錯,商業網站到6以上便算步入正軌了。
網上雖然有不少現成的查詢器及源碼,但是光用別人的畢竟不符合程序員風格,所以今天自己用Java重造輪子又寫了個PageRank查詢實現,捎帶著把一些常用搜索引擎的網站鏈接及反向鏈接查詢也加上了。
源碼如下:
GooglePageRank.java
- package org.loon.test;
- import java.io.IOException;
- import java.util.Random;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- *Copyright2008
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
- *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
- *theLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
- *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
- *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
- *theLicense.
- *
- *@projectloonframework
- *@authorchenpeng
- *@email:ceponline@yahoo.com.cn
- *@version0.1
- */
- public class GooglePageRank{
- //googlepagerank服務器ip地址列表(最近google小氣了很多,反復查詢一個封ip)
- final static String[]GoogleServiceIP= new String[]{ "64.233.161.100" ,
- "64.233.161.101" , "64.233.183.91" , "64.233.189.44" , "66.102.1.103" ,
- "66.102.9.115" , "66.249.89.83" , "66.249.91.99" , "66.249.93.190" };
- //google用識別標記
- final static private int GOOGLE_MAGIC= 0xE6359A60 ;
- //ch數值混合器
- private class CHMix{
- int a;
- int b;
- int c;
- public CHMix(){
- this ( 0 , 0 , 0 );
- }
- public CHMix( int a, int b, int c){
- this .a=a;
- this .b=b;
- this .c=c;
- }
- }
- /**
- *按google要求混合成ch數據
- *
- *@parammix
- */
- private static void mix( final CHMixmix){
- mix.a-=mix.b;
- mix.a-=mix.c;
- mix.a^=mix.c>> 13 ;
- mix.b-=mix.c;
- mix.b-=mix.a;
- mix.b^=mix.a<< 8 ;
- mix.c-=mix.a;
- mix.c-=mix.b;
- mix.c^=mix.b>> 13 ;
- mix.a-=mix.b;
- mix.a-=mix.c;
- mix.a^=mix.c>> 12 ;
- mix.b-=mix.c;
- mix.b-=mix.a;
- mix.b^=mix.a<< 16 ;
- mix.c-=mix.a;
- mix.c-=mix.b;
- mix.c^=mix.b>> 5 ;
- mix.a-=mix.b;
- mix.a-=mix.c;
- mix.a^=mix.c>> 3 ;
- mix.b-=mix.c;
- mix.b-=mix.a;
- mix.b^=mix.a<< 10 ;
- mix.c-=mix.a;
- mix.c-=mix.b;
- mix.c^=mix.b>> 15 ;
- }
- /**
- *獲得ch數值混合器
- *
- *@return
- */
- public static CHMixgetInnerCHMix(){
- return new GooglePageRank(). new CHMix();
- }
- /**
- *通過url獲得googlech(google數據庫針對頁面的全球唯一標識)
- *
- *@paramurl
- *@return
- */
- public static StringGoogleCH( final Stringurl){
- //格式化為google要求的info:url模式
- StringnUrl=String.format( "info:%s" , new Object[]{url});
- //獲得新url字符串格式
- char []urls=nUrl.toCharArray();
- //獲得新url長度
- int length=urls.length;
- //獲得一個ch數值混合器
- CHMixchMix=GooglePageRank.getInnerCHMix();
- //為c注入google識別標識
- chMix.c=GOOGLE_MAGIC;
- //為a、b項注入google要求的初始標識
- chMix.a=chMix.b= 0x9E3779B9 ;
- int k= 0 ;
- int len=length;
- while (len>= 12 ){
- chMix.a+=( int )(urls[k+ 0 ]+(urls[k+ 1 ]<< 8 )
- +(urls[k+ 2 ]<< 16 )+(urls[k+ 3 ]<< 24 ));
- chMix.b+=( int )(urls[k+ 4 ]+(urls[k+ 5 ]<< 8 )
- +(urls[k+ 6 ]<< 16 )+(urls[k+ 7 ]<< 24 ));
- chMix.c+=( int )(urls[k+ 8 ]+(urls[k+ 9 ]<< 8 )
- +(urls[k+ 10 ]<< 16 )+(urls[k+ 11 ]<< 24 ));
- //獲得混合運算后的數據
- GooglePageRank.mix(chMix);
- k+= 12 ;
- len-= 12 ;
- }
- chMix.c+=length;
- //產生googlech的11位標識
- switch (len){
- case 11 :
- chMix.c+=( int )(urls[k+ 10 ]<< 24 );
- case 10 :
- chMix.c+=( int )(urls[k+ 9 ]<< 16 );
- case 9 :
- chMix.c+=( int )(urls[k+ 8 ]<< 8 );
- case 8 :
- chMix.b+=( int )(urls[k+ 7 ]<< 24 );
- case 7 :
- chMix.b+=( int )(urls[k+ 6 ]<< 16 );
- case 6 :
- chMix.b+=( int )(urls[k+ 5 ]<< 8 );
- case 5 :
- chMix.b+=( int )(urls[k+ 4 ]);
- case 4 :
- chMix.a+=( int )(urls[k+ 3 ]<< 24 );
- case 3 :
- chMix.a+=( int )(urls[k+ 2 ]<< 16 );
- case 2 :
- chMix.a+=( int )(urls[k+ 1 ]<< 8 );
- case 1 :
- chMix.a+=( int )(urls[k+ 0 ]);
- break ;
- default :
- break ;
- }
- //獲得混合運算后的數據
- GooglePageRank.mix(chMix);
- //獲得未修訂的CH
- Stringtch=String.valueOf(chMix.c);
- //矯正差值后反饋正確CH
- return String
- .format( "6%s" , new Object[]{tch.length()< 10 ?( "-" +tch)
- .intern():tch});
- }
- /**
- *正則匹配pagerank結果
- *
- *@paramvalue
- *@return
- */
- private static StringMatchRank( final Stringvalue){
- Patternpattern=Pattern.compile( "Rank_1:[0-9]:([0-9]+)" );
- Matchermatcher=pattern.matcher(value);
- if (matcher.find()){
- return matcher.group( 1 );
- }
- return "0" ;
- }
- /**
- *獲得指定頁面的googlepagerank值
- *
- *@paramurl
- *@return
- */
- public static StringGooglePR( final Stringurl){
- Stringrip=GoogleServiceIP[ new Random()
- .nextInt(GoogleServiceIP.length)];
- return GooglePR(url,rip);
- }
- /**
- *以指定的google服務器獲得指定頁面的googlepagerank值
- *
- *@paramurl
- *@paramip
- *@return
- */
- public static StringGooglePR( final Stringurl, final Stringip){
- //產生查詢用唯一標識
- Stringchecksum=GoogleCH(url);
- //產生查詢用url
- StringqueryUrl=String
- .format(
- "http://%s/search?client=navclient-auto&ch=%s&features=Rank&q=info:%s" ,
- new Object[]{ip,checksum,url});
- Stringresponse;
- try {
- response=SimpleWebClient.getRequestHttp(queryUrl);
- } catch (IOExceptione){
- response= "" ;
- }
- if (response.length()== 0 ){
- return "0" ;
- } else {
- return GooglePageRank.MatchRank(response);
- }
- }
- }
SimpleWebClient.java
- package org.loon.test;
- import java.io.BufferedInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- import java.util.Map.Entry;
- import sun.misc.BASE64Encoder;
- /**
- *Copyright2008
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
- *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
- *theLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
- *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
- *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
- *theLicense.
- *
- *@projectloonframework
- *@authorchenpeng
- *@email:ceponline@yahoo.com.cn
- *@version0.1
- */
- public class SimpleWebClient{
- /**
- *向指定url發送請求并獲得響應數據
- *
- *@paramurlString
- *@return
- *@throwsIOException
- */
- public static StringgetRequestHttp(StringurlString) throws IOException{
- return getRequestHttp(urlString, "utf-8" );
- }
- /**
- *向指定url發送請求并獲得響應數據
- *
- *@paramurlString
- *@paramencoding
- *@return
- *@throwsIOException
- */
- public static StringgetRequestHttp(StringurlString,Stringencoding)
- throws IOException{
- return getRequestHttp(urlString,encoding, null , 5000 );
- }
- /**
- *向指定url發送請求并獲得響應數據
- *
- *@paramurlString
- *@paramencoding
- *@paramparameter
- *@return
- *@throwsIOException
- */
- public static StringgetRequestHttp( final StringurlString,
- final Stringencoding, final Mapparameter, final int timeout)
- throws IOException{
- StringnURL=(urlString.startsWith( "http://" )||urlString
- .startsWith( "https://" ))?urlString:( "http:" +urlString)
- .intern();
- Stringuser= null ;
- Stringpassword= null ;
- Stringmethod= "GET" ;
- Stringpost= null ;
- Stringdigest= null ;
- StringresponseContent= "ERROR" ;
- boolean foundRedirect= false ;
- Mapheaders= new HashMap();
- if (parameter!= null ){
- SetentrySet=parameter.entrySet();
- for (Iteratorit=entrySet.iterator();it.hasNext();){
- Entryheader=(Entry)it.next();
- Stringkey=(String)header.getKey();
- Stringvalue=(String)header.getValue();
- if ( "user" .equals(key)){
- user=value;
- } else if ( "pass" .equals(key)){
- password=value;
- } else if ( "method" .equals(key)){
- method=value;
- } else if ( "post" .equals(key)){
- post=value;
- } else {
- headers.put(key,value);
- }
- }
- }
- URLurl= new URL(nURL);
- if (user!= null &&password!= null ){
- BASE64Encoderbase64= new BASE64Encoder();
- digest= "Basic"
- +base64.encode((user+ ":" +password).getBytes());
- }
- do {
- HttpURLConnectionurlConnection=(HttpURLConnection)url
- .openConnection();
- //添加訪問授權
- if (digest!= null ){
- urlConnection.setRequestProperty( "Authorization" ,digest);
- }
- urlConnection.setDoOutput( true );
- urlConnection.setDoInput( true );
- urlConnection.setUseCaches( false );
- urlConnection.setInstanceFollowRedirects( false );
- urlConnection.setRequestMethod(method);
- if (timeout> 0 ){
- urlConnection.setConnectTimeout(timeout);
- }
- //模擬http頭文件
- urlConnection.setRequestProperty( "User-Agent" , "Mozilla/4.0(compatible;MSIE7.0;)" );
- urlConnection.setRequestProperty( "Accept" , "image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/msword,application/vnd.ms-excel,application/vnd.ms-powerpoint,*/*" );
- //追加http頭文件
- SetheadersSet=headers.entrySet();
- for (Iteratorit=headersSet.iterator();it.hasNext();){
- Entryentry=(Entry)it.next();
- urlConnection.setRequestProperty((String)entry.getKey(),
- (String)entry.getValue());
- }
- if (post!= null ){
- OutputStreamWriteroutRemote= new OutputStreamWriter(
- urlConnection.getOutputStream());
- outRemote.write(post);
- outRemote.flush();
- }
- //獲得響應狀態
- int responseCode=urlConnection.getResponseCode();
- //獲得返回的數據長度
- int responseLength=urlConnection.getContentLength();
- if (responseCode== 302 ){
- //重定向
- Stringlocation=urlConnection.getHeaderField( "Location" );
- url= new URL(location);
- foundRedirect= true ;
- } else {
- BufferedInputStreamin;
- if (responseCode== 200 ||responseCode== 201 ){
- in= new BufferedInputStream(urlConnection.getInputStream());
- } else {
- in= new BufferedInputStream(urlConnection.getErrorStream());
- }
- int size=responseLength==- 1 ? 4096 :responseLength;
- if (encoding!= null ){
- responseContent=SimpleWebClient.read(in,size,encoding);
- } else {
- ByteArrayOutputStreamout= new ByteArrayOutputStream();
- byte []bytes= new byte [size];
- int read;
- while ((read=in.read(bytes))>= 0 ){
- out.write(bytes, 0 ,read);
- }
- responseContent= new String(out.toByteArray());
- in.close();
- out.close();
- }
- foundRedirect= false ;
- }
- //如果重定向則繼續
- } while (foundRedirect);
- return responseContent;
- }
- /**
- *轉化InputStream為String
- *
- * @param in
- * @param size
- * @return
- * @throws IOException
- */
- private static Stringread( final InputStreamin, final int size,
- final Stringencoding) throws IOException{
- StringBuildersbr= new StringBuilder();
- int nSize=size;
- if (nSize== 0 ){
- nSize= 1 ;
- }
- char []buffer= new char [nSize];
- int offset= 0 ;
- InputStreamReaderisr= new InputStreamReader(in,encoding);
- while ((offset=isr.read(buffer))!=- 1 ){
- sbr.append(buffer, 0 ,offset);
- }
- in.close();
- isr.close();
- return sbr.toString();
- }
- }
WebAppraise.java
- package org.loon.test;
- import java.io.IOException;
- /**
- *Copyright2008
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
- *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
- *theLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
- *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
- *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
- *theLicense.
- *
- *@projectloonframework
- *@authorchenpeng
- *@email:ceponline@yahoo.com.cn
- *@version0.1
- */
- public class WebAppraise{
- private StringgoogleSum;
- private StringbaiduSum;
- private StringmsnSum;
- private StringaltaVistaSum;
- private StringallTheWebSum;
- private StringyahooSum;
- private StringtestURL;
- public WebAppraise( final Stringurl){
- if (url!= null &&! "" .equals(url)){
- this .testURL=url.trim();
- if ( this .testURL.startsWith( "http://" )){
- this .testURL= this .testURL.substring( 7 );
- }
- if ( this .testURL.startsWith( "https://" )){
- this .testURL= this .testURL.substring( 8 );
- }
- } else {
- throw new RuntimeException( "urlisNULL!" );
- }
- }
- /**
- *分析指定鏈接結果,并返回整型數值
- *
- *@paramsearchURL
- *@paramanchor
- *@paramtrail
- *@return
- */
- private static int getLinks( final StringsearchURL, final Stringanchor,
- final Stringtrail){
- int count= 0 ;
- StringserverResponse;
- try {
- //我國特色……
- if (searchURL.startsWith( "http://www.baidu.com" )){
- //永不離休的gb2312同志(-_-||)
- serverResponse=SimpleWebClient.getRequestHttp(searchURL,
- "gb2312" );
- } else {
- serverResponse=SimpleWebClient.getRequestHttp(searchURL);
- }
- } catch (IOExceptione){
- serverResponse=e.getMessage();
- }
- int pos=serverResponse.indexOf(anchor);
- if (pos> 1 ){
- serverResponse=serverResponse.substring(pos+anchor.length());
- pos=serverResponse.indexOf(trail);
- Stringvalue=serverResponse.substring( 0 ,pos).trim();
- value=value.replace( "," , "" );
- value=value.replace( "." , "" );
- count=Integer.parseInt(value);
- }
- return count;
- }
- public StringgetAllTheWebSite(){
- return getAllTheWebSite( false );
- }
- public StringgetAllTheWebSite( boolean isDomain){
- try {
- StringallTheWeb;
- if (isDomain){
- allTheWeb= "http://www.alltheweb.com/search?cat=web&cs=utf8&rys=0&itag=crv&_sb_lang=any&q=linkdomain%3A"
- + this .testURL;
- } else {
- allTheWeb= "http://www.alltheweb.com/search?cat=web&cs=utf-8&q=link%3Ahttp%3A%2F%2F"
- + this .testURL+ "&_sb_lang=any" ;
- }
- allTheWebSum= ""
- +getLinks(allTheWeb, "<spanclass=/"ofSoMany/">" ,
- "</span>" );
- } catch (Exceptionex){
- allTheWebSum=ex.getMessage();
- }
- return allTheWebSum;
- }
- public StringgetAltaVistaSite(){
- return getAltaVistaSite( false );
- }
- public StringgetAltaVistaSite( boolean isDomain){
- try {
- StringaltaVista;
- if (isDomain){
- altaVista= "http://www.altavista.com/web/results?itag=ody&q=link%3A"
- + this .testURL+ "&kgs=0&kls=0" ;
- } else {
- altaVista= "http://www.altavista.com/web/results?itag=ody&kgs=0&kls=0&q=site%3A"
- + this .testURL;
- }
- altaVistaSum= "" +getLinks(altaVista, "AltaVistafound" , "" );
- } catch (Exceptionex){
- altaVistaSum=ex.getMessage();
- }
- return altaVistaSum;
- }
- public StringgetGooglePR(){
- return GooglePageRank.GooglePR( this .testURL);
- }
- public StringgetGoogleSite(){
- return getGoogleSite( false );
- }
- public StringgetGoogleSite( final boolean isDomian){
- try {
- Stringgoogle;
- //反向鏈接
- if (isDomian){
- google= "http://www.google.com/search?hl=en&q=link%3A"
- + this .testURL;
- } else {
- google= "http://www.google.com/search?hl=en&q=site%3A"
- + this .testURL+ "&btnG=Google+Search&aq=f&oq=" ;
- }
- googleSum= "" +getLinks(google, "about<b>" , "</b>" );
- } catch (Exceptionex){
- googleSum=ex.getMessage();
- }
- return googleSum;
- }
- public StringgetBaiduSite(){
- return getBaiduSite( false );
- }
- public StringgetBaiduSite( final boolean isDomian){
- try {
- Stringbaidu;
- if (isDomian){
- baidu= "http://www.baidu.com/s?wd=domain%3A" + this .testURL
- + "&cl=3" ;
- } else {
- baidu= "http://www.baidu.com/s?wd=site%3A" + this .testURL;
- }
- baiduSum= "" +getLinks(baidu, "找到相關網頁" , "篇" );
- } catch (Exceptionex){
- Stringbaidu;
- if (isDomian){
- baidu= "http://www.baidu.com/s?wd=domain%3A" + this .testURL
- + "&cl=3" ;
- } else {
- baidu= "http://www.baidu.com/s?wd=site%3A" + this .testURL;
- }
- baiduSum= "" +getLinks(baidu, "找到相關網頁約" , "篇" );
- }
- return baiduSum;
- }
- public StringgetYahooSite(){
- return getYahooSite( false );
- }
- public StringgetYahooSite( final boolean isDomian){
- try {
- Stringyahoo;
- if (isDomian){
- yahoo= "http://sitemap.cn.yahoo.com/search?p=" + this .testURL
- + "&bwm=i" ;
- yahooSum= "" +getLinks(yahoo, "<strong>" , "</strong>" );
- } else {
- yahoo= "http://www.yahoo.cn/s?p=site%3A" + this .testURL
- + "&pid=hp&v=web" ;
- yahooSum= "" +getLinks(yahoo, "找到相關網頁約" , "條" );
- }
- } catch (Exceptionex){
- yahooSum=ex.getMessage();
- }
- return yahooSum;
- }
- public StringgetMsnSite(){
- return getMsnSite( false );
- }
- public StringgetMsnSite( boolean isDomain){
- try {
- Stringmsn;
- if (isDomain){
- msn= "http://cnweb.search.live.com/results.aspx?q=link%3A"
- + this .testURL+ "&mkt=zh-cn&scope=&FORM=LIVSO" ;
- } else {
- msn= "http://cnweb.search.live.com/results.aspx?q=site%3A"
- + this .testURL+ "&go=&form=QBRE" ;
- }
- msnSum= "" +getLinks(msn, "共" , "條搜索結果" );
- } catch (Exceptionex){
- msnSum=ex.getMessage();
- }
- return msnSum;
- }
- public StringgetTestURL(){
- return testURL;
- }
- }
Test.java
- packageorg.loon.test;
- /**
- *Copyright2008
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
- *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
- *theLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
- *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
- *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
- *theLicense.
- *
- *@projectloonframework
- *@authorchenpeng
- *@email:ceponline@yahoo.com.cn
- *@version0.1
- */
- public class Test{
- public static void main(String[]args){
- WebAppraiseappraise= new WebAppraise( "http://blog.csdn.net/cping1982" );
- System. out .println( "GooglePagerRank值:" +appraise.getGooglePR());
- System. out .println( "google收錄:" +appraise.getGoogleSite());
- System. out .println( "google反向收錄:" +appraise.getGoogleSite( true ));
- System. out .println( "yahoo收錄:" +appraise.getYahooSite());
- System. out .println( "yahoo反向收錄:" +appraise.getYahooSite( true ));
- System. out .println( "baidu收錄:" +appraise.getBaiduSite());
- System. out .println( "baidu反向收錄:" +appraise.getBaiduSite( true ));
- System. out .println( "msn收錄:" +appraise.getMsnSite());
- System. out .println( "msn反向收錄:" +appraise.getMsnSite( true ));
- System. out .println( "AllTheWeb收錄:" +appraise.getAllTheWebSite());
- System. out .println( "AllTheWeb反向收錄:" +appraise.getAllTheWebSite( true ));
- System. out .println( "AltaVista收錄:" +appraise.getAltaVistaSite());
- System. out .println( "AltaVista反向收錄:" +appraise.getAltaVistaSite( true ));
- }
- }
檢測 http://blog.csdn.net/cping1982 運行結果如下圖:

源碼下載地址: http://download.csdn.net/source/929348
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
