精华内容
下载资源
问答
  • http://facebook.stackoverflow.com/questions/12644229/ios-6-facebook-posting-procedure-ends-up-with-remote-app-id-does-not-match-stor
    展开全文
  • FaceBook数据采集——模拟登录

    万次阅读 2016-06-27 22:27:08
    获取FaceBook cookie值的两种方法,一种是模拟登陆的方法,另一种使用selenium模拟手工操作。

    前言


    本科的毕业设计有做facebook的数据采集工作。在做的过程中,发现网上现成的资料较少,所以将我的解决办法分享出来,希望大家一起讨论并提出宝贵意见。

    Facebook数据采集可以通过调用API,但是API获取数据较为混乱,没法有效的将数据组织在一起,所以就放弃了这种办法,改为采用网络爬虫的方式,但是网络爬虫个也存在各种问题。

    在临近毕业的两周,我尽量每两天更新一篇文章,讨论其中一个问题的解决办法。

    今天讨论的是模拟登录问题。

    总的来说,使用python模拟登陆有两大类方法,一种是发送请求数据包,模拟数据交互的过程;另一种办法是使用selenium包,模拟用户的手工操作。

    数据交互的方法


    数据交互的方法的代码量比较多,但是运行起来速度要比使用selenium包快的多,也更容易控制。但是网上有人说,FaceBook会时常变动登陆过程中需要post的值,所以没有办法长期使用固定的代码。据我观察,近一个月的时间内,FaceBook的登陆过程没有发生变化。。。所以,自己看着办吧。反而是使用selenium包的方法有着很大的不确定性,具体情况放在下面讨论。

    Facebook的登陆主要有三步,过程如下:

    step 1

    进入https://www.facebook.com,获取set-cookies值fr,下一步需要post的值lsd、lgnrnd、lgnjs,这三个值在html中均放在input标签下,且type均为‘hidden’,如下:

    <input type="hidden" name="lsd" value="AVpI6yeG" autocomplete="off" />
    <input type="hidden" name="lgnrnd" value="171524_eEMy" />
    <input type="hidden" id="lgnjs" name="lgnjs" value="n" /></span>

    使用正则语句将value值提取出即可,Cookie值使用cookiejar存储即可,方便下一步的使用。代码如下:

    def login_first_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            html = content.read()
            lsd=lgndim=lgnjs=lgnrnd=''
    
            # 查找lsd
            reg = r'<input type="hidden" name="lsd" value="([A-Za-z0-9]*)" autocomplete="off" />'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lsd = search.group(1)
    
            # 查找lgndim lgndim可能为空
            reg = r'<input type="hidden" autocomplete="off" name="lgndim" value="([A-Za-z0-9]*)"'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lgndim = search.group(1)
    
            # 查找lgnrnd
            reg = r'<input type="hidden" name="lgnrnd" value="([A-Za-z0-9]*_[A-Za-z0-9]*)" />'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lgnrnd = search.group(1)
    
            # 查找lgnjs
            reg = r'<input type="hidden" id="lgnjs" name="lgnjs" value="([A-Za-z0-9]*)" />'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lgnjs = search.group(1)
            
            #设置第二步中要post的值
            self.login_post_values = 'lsd='+lsd+'&email='+self.email+'&pass='+self.password+\
                                     '&persistent=&default_persistent=1&timezone=&lgndim=&lgnrnd='\
                                     +lgnrnd+'&lgnjs='+lgnjs+'&locale=zh_CN&next=https%3A%2F%2Fwww.facebook.com%2F'
    
            print '-------------------------------------------'
            print 'lsd:',lsd
            print 'lgndim:',lgndim
            print 'lgnjs:',lgnjs
            print 'lgnrnd:',lgnrnd
            print self.cj
            for key in self.cj:
                print key.name,':',key.value
            print '-------------------------------------------'</span>


    step 2


    进入https://www.facebook.com/login.php?login_attempt=1&lwv=110,在header的cookies中提交fr的值,在post中提交下面八个值,其中:lsd、email、pass、persistent、default_persistent、timezone、lgndim、lgnrnd、lgnjs、locale、next。这些值必须按照指定顺序提交,这个按顺序提交纠结了我一天。。。。其中email是登陆的用户名,pass是密码。Local是地区,比如“zh_CN”。Next为https://www.facebook.com/。注意发送前使用urllib.urlencode(values)函数对post的值进行url编码。其输入是一个字典,输出是一段字符串。Python的urllib2包中处理header数据时,是以字典类型作为输入的,所以不需要进行url编码,这个小问题也需要注意,否则会浪费很多时间。
    def login_second_step(self):
            sent_url = 'https://www.facebook.com/login.php?login_attempt=1&lwv=110'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header,data=self.login_post_values)
            content=self.opener.open(request)
            print '-------------------------------------------'
            for key in self.cj:
                print key.name,':',key.value
            print '-------------------------------------------'</span>
    这一步的response是302重定向报文,python会自动向新目标https://www.facebook.com/发送一个新的请求,但是这个请求没有带上我们获取的cookie值。为了使得重定向报文得到新的cookie值,需要自己编写http_error_302()方法,参考了下面这篇博客http://www.hawkwithwind.net/blog/2013/08/13/python-urllib2-%E9%87%8D%E5%AE%9A%E5%90%91%E6%97%B6%E8%8E%B7%E5%8F%96cookie/
    首先我们要自己编写一个遇到302重定向时的解决办法,在这里我的做法比较粗暴,手工处理cookie值,并将新cookie值添加到请求的头部,代码如下:
    class RedirectHandler(urllib2.HTTPRedirectHandler):
        def http_error_302(self,req,fp,code,msg,headers):
            print '############ GOT 302 ###############'
            cookiemap = {}
            setcookie = str(headers["Set-Cookie"])
            cookieTokens = ["Domain","Expires", "Path", "Max-Age",'path','domain']
            tokens = setcookie.split(";")
            for cookie in tokens:
                cookie = cookie.strip()
                if cookie.startswith("Expires="):
                    cookies = cookie.split(",", 2)
                    if len(cookies) > 2:
                        cookie = cookies[2]
                        cookie = cookie.strip()
                else :
                    cookies = cookie.split(",", 1)
                    if len(cookies) > 1:
                        cookie = cookies[1]
                        cookie = cookie.strip()
                namevalue = cookie.split("=", 1)
                if len(namevalue) > 1:
                    name = namevalue[0]
                    value = namevalue[1]
                    if name not in cookieTokens:
                        cookiemap[name] = value
            print cookiemap
            str_cookie = ''
            for key in cookiemap:
                str_cookie = str_cookie + key + '=' + cookiemap[key] + '; '
            str_cookie = str_cookie[:-2]
            print str_cookie
            req.add_header("Cookie", str_cookie)<span style="white-space:pre">	</span>#设置新的cookie值
            return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)</span>
    然后,需要在urllib2包中提交请求的opener中添加我们的302处理方法,代码如下:
    opener = urllib2.build_opener(httpHandler, httpsHandler,RedirectHandler,
                                          urllib2.HTTPCookieProcessor(self.cj))</span>
    至此,302重定向问题就解决完了,当python检测到收到重定向页面后,会执行我们编写的出错处理方法。

    step 3


    有了前面的铺垫,第三步就简单了很多,直接访问facebook的个人主页即可。
    在这里不得不提一下cookiejar这个小工具,cookiejar来源于cookielib包。这个小工具能够自动的存储已经获取的cookie值(即response头部的set-cookie值),并在下一次访问时添加上这些cookie值。当然,我们也能够自己增删改查cookiejar中的内容,使用起来很方便。否则我们需要自己动手写处理cookie的代码,非常浪费时间。
    def login_third_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            print '-------------------------------------------'
            print content.read()
            print '-------------------------------------------'</span>
    到这里,我们已经登录到了facebook,但是只是到了欢迎页面,并查看不了“朋友圈”,因为此时,cookie中少了一个值,“datr”,这个值在step 3的response的数据中,使用相同的办法找到并提交即可,所以需要对step 3进行修改:
        def login_third_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            # print content.read()
            tmp_html = content.read()
            #查找datr
            reg = r'"_js_datr","([A-Za-z0-9]*)"'
            m = re.compile(reg)
            search = re.search(m,tmp_html)
            datr = ''
            if search:
                datr = search.group(1)
            print '-------------------------------------------'
            print 'datr: ',datr
            self.cj.set_cookie(cookielib.Cookie(
                version=0,
                name='datr',
                value=datr,
                port=None,
                port_specified=False,
                domain=".facebook.com",
                domain_specified=True,
                domain_initial_dot=False,
                path="/",
                path_specified=True,
                secure=False,
                expires=None,
                discard=False,
                comment=None,
                comment_url=None,
                rest=None
            ))
    然后把数据再次提交即可:
    def login_fourth_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            print '-------------------------------------------'
            print '               getting html        '
            # print content.read()
            self.html = content.read()
            print '-------------------------------------------'

    至此,模拟登陆就完成了,至于解析数据,放在下一篇文章再讨论。整个模拟登陆代码如下:
    # -*- coding:gb2312 -*-
    __author__ = 'HYDT'
    
    import urllib2
    import re
    import cookielib
    
    class RedirectHandler(urllib2.HTTPRedirectHandler):
        def http_error_302(self,req,fp,code,msg,headers):
            print '############ GOT 302 ###############'
            cookiemap = {}
            setcookie = str(headers["Set-Cookie"])
            cookieTokens = ["Domain","Expires", "Path", "Max-Age",'path','domain']
            tokens = setcookie.split(";")
            for cookie in tokens:
                cookie = cookie.strip()
                if cookie.startswith("Expires="):
                    cookies = cookie.split(",", 2)
                    if len(cookies) > 2:
                        cookie = cookies[2]
                        cookie = cookie.strip()
                else :
                    cookies = cookie.split(",", 1)
                    if len(cookies) > 1:
                        cookie = cookies[1]
                        cookie = cookie.strip()
                namevalue = cookie.split("=", 1)
                if len(namevalue) > 1:
                    name = namevalue[0]
                    value = namevalue[1]
                    if name not in cookieTokens:
                        cookiemap[name] = value
            print cookiemap
            str_cookie = ''
            for key in cookiemap:
                str_cookie = str_cookie + key + '=' + cookiemap[key] + '; '
            str_cookie = str_cookie[:-2]
            print str_cookie
            req.add_header("Cookie", str_cookie)
            return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
    
    class get_html():
        email = '%2B<span style="font-family: Arial, Helvetica, sans-serif;">86185xxxxxxxx</span><span style="font-family: Arial, Helvetica, sans-serif;">'  #用户名 +86185xxxxxxxx 注意加号改成url编码 %2B</span>
        password = ''       #密码
    
        cj = cookielib.CookieJar()
        login_post_values = ''
        html = ''
    
        facebook_header = {
            "Connection":"close",
            "Cache-Control":"max-age=0",
            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Origin":"https://www.facebook.com",
            "Upgrade-Insecure-Requests":" 1",
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/45.0.2454.101 Safari/537.36",
            "Content-Type":"application/x-www-form-urlencoded",
            "Referer":"https://www.facebook.com/",
            "Accept-Language":"zh-CN,zh;q=0.8"
        }
        opener = urllib2.build_opener()
    
        def get_opener(self):
            # self.cj = self.cj.clear()
            httpHandler = urllib2.HTTPHandler(debuglevel=1)
            httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
            opener = urllib2.build_opener(httpHandler, httpsHandler,RedirectHandler,
                                          urllib2.HTTPCookieProcessor(self.cj))
            return opener
    
        def login_first_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            html = content.read()
            lsd=lgndim=lgnjs=lgnrnd=''
    
            # 查找lsd
            reg = r'<input type="hidden" name="lsd" value="([A-Za-z0-9]*)" autocomplete="off" />'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lsd = search.group(1)
    
            # 查找lgndim lgndim可能为空
            reg = r'<input type="hidden" autocomplete="off" name="lgndim" value="([A-Za-z0-9]*)"'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lgndim = search.group(1)
    
            # 查找lgnrnd
            reg = r'<input type="hidden" name="lgnrnd" value="([A-Za-z0-9]*_[A-Za-z0-9]*)" />'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lgnrnd = search.group(1)
    
            # 查找lgnjs
            reg = r'<input type="hidden" id="lgnjs" name="lgnjs" value="([A-Za-z0-9]*)" />'
            m = re.compile(reg)
            search = re.search(m,html)
            if search:
                lgnjs = search.group(1)
    
            #设置第二步中要post的值
            self.login_post_values = 'lsd='+lsd+'&email='+self.email+'&pass='+self.password+\
                                     '&persistent=&default_persistent=1&timezone=&lgndim=&lgnrnd='\
                                     +lgnrnd+'&lgnjs='+lgnjs+'&locale=zh_CN&next=https%3A%2F%2Fwww.facebook.com%2F'
    
            print '-------------------------------------------'
            print 'lsd:',lsd
            print 'lgndim:',lgndim
            print 'lgnjs:',lgnjs
            print 'lgnrnd:',lgnrnd
            print self.cj
            for key in self.cj:
                print key.name,':',key.value
            print '-------------------------------------------'
    
        def login_second_step(self):
            sent_url = 'https://www.facebook.com/login.php?login_attempt=1&lwv=110'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header,data=self.login_post_values)
            content=self.opener.open(request)
            print '-------------------------------------------'
            for key in self.cj:
                print key.name,':',key.value
            print '-------------------------------------------'
    
        def login_third_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            # print content.read()
            tmp_html = content.read()
            #查找datr
            reg = r'"_js_datr","([A-Za-z0-9]*)"'
            m = re.compile(reg)
            search = re.search(m,tmp_html)
            datr = ''
            if search:
                datr = search.group(1)
            print '-------------------------------------------'
            print 'datr: ',datr
            self.cj.set_cookie(cookielib.Cookie(
                version=0,
                name='datr',
                value=datr,
                port=None,
                port_specified=False,
                domain=".facebook.com",
                domain_specified=True,
                domain_initial_dot=False,
                path="/",
                path_specified=True,
                secure=False,
                expires=None,
                discard=False,
                comment=None,
                comment_url=None,
                rest=None
            ))
    
        def login_fourth_step(self):
            sent_url = 'https://www.facebook.com'
            request = urllib2.Request(url=sent_url,headers=self.facebook_header)
            content=self.opener.open(request)
            print '-------------------------------------------'
            print '               getting html        '
            # print content.read()
            self.html = content.read()
            print '-------------------------------------------'
    
    
    
        def get_proxy(self):
            proxy = {'http':'http://127.0.0.1:1080'}
            proxy_support = urllib2.ProxyHandler(proxy)
            opener = urllib2.build_opener(proxy_support)
            urllib2.install_opener(opener)
            print "#########Open Proxy!##########"
    
        def __init__(self):
            self.get_proxy()
            self.cj = cookielib.CookieJar()
            self.opener = self.get_opener()
            self.login_first_step()
            self.login_second_step()
            self.login_third_step()
            self.login_fourth_step()
    
    # get_html()


    模拟手工操作的方法


    这种方法就十分简单了,直接上代码。
    def get_cookies(self):
            print "=============================="
            print "       Geting Cookies!        "
            print "=============================="
            #选择浏览器
            browser = webdriver.Firefox()   
            # browser.implicitly_wait(10)
            # browser.set_window_size(0,0)
            #访问facebook网页
            browser.get('https://www.facebook.com/')    
            #输入账户密码
            browser.find_element_by_id('email').clear() 
            browser.find_element_by_id('email').send_keys(self.email)
            browser.find_element_by_id('pass').clear()
            browser.find_element_by_id('pass').send_keys(self.password)
            #模拟点击登录按钮,两种不同的点击方法。。。
            try:    
                browser.find_element_by_xpath('//button[@id="loginbutton"]').send_keys(Keys.ENTER)
            except:
                browser.find_element_by_xpath('//input[@tabindex="4"]').send_keys(Keys.ENTER)
            # time.sleep(10)
            browser.find_element_by_xpath('//a[@href="https://www.facebook.com/?ref=logo"]').send_keys(Keys.ENTER)
    
            # browser.file_detector_context('Facebook').send_keys(Keys.ENTER)
            #获取cookie
            cookies = browser.get_cookies() 
            #关闭浏览器
            browser.close() </span>
     
      


    总结


    在这篇博文中,介绍了两种模拟登陆的方法,一种是模拟数据交互过程,该方法的优点在于执行速度快,相对较为稳定,缺点是开发时间长。模拟手工操作的方法正好相反,运行速度较慢,但开发速度极快。根据获取的cookie值可以看出来,一次模拟登陆的cookie值,有效期是三个月。所以,该程序三个月运行一次即可,那么运行速度慢点完全可以接受。所以,在现实的工程中,到底使用哪种方法,可以依据情况而定。

    展开全文
  • Facebook脚本DOM操作 该存储库包含许多脚本,通过直接操作DOM,Facebook用户不需要访问令牌。... JavaScript可以访问Facebook。 Khôngcầncàiđặt Cáchdùng Làmtheohướngdẫnởumỗiđoạnmã(cácdò
  • 动态Facebook广告-源码

    2021-02-18 06:05:29
    动态Facebook广告 该工具是为车辆创建的,但您可以对其进行自定义并将其用于自己的产品 通过使用此工具,您可以: 生成动态广告的Feed文件 快速轻松地优化数据馈送 通过更新易于理解的类... 您必须有权访问Facebook A
  • 该存储库包含开源PHP SDK,可让您从PHP应用程序访问Facebook平台。 安装 Facebook PHP SDK可以与一起安装。 运行以下命令: composer require facebook/graph-sdk 请注意,将Facebook SDK与 6.x一起使用时会出现...
  • Facebook 分享 url

    2019-01-29 14:31:33
    Facebook分享 URL demo。通过这个 demo 可以快速学习Facebook的分享
  • Facebook 登录接入记录

    千次阅读 2017-11-12 18:03:38
    Facebook 登录接入记录

    Facebook 登录接入记录

    1. 注册 Facebook 账号

    2. 在开发者中心创建应用

    https://developers.facebook.com/

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    3. 接入sdk

    https://developers.facebook.com/docs/android/getting-started/,较早的版本有中文

    compile 'com.facebook.android:facebook-login:4.28.0'
    
    
    <meta-data android:name="com.facebook.sdk.ApplicationId"
               android:value="@string/facebook_app_id"/>
    
    <activity android:name="com.facebook.FacebookActivity"
              android:configChanges=
                  "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
              android:label="@string/app_name" />
    <activity
        android:name="com.facebook.CustomTabActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="@string/fb_login_protocol_scheme" />
        </intent-filter>
    </activity>

    主要代码

    先注册登录回调

     LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            Logger.d(loginResult.getAccessToken());
                            // Profile.getCurrentProfile()  null 
                        }
    
                        @Override
                        public void onCancel() {
                            // App code
                        }
    
                        @Override
                        public void onError(FacebookException exception) {
                            // App code
                        }
                    });

    调用登录

    Collection<String> permissions = Arrays.asList("public_profile", "email", " user_friends");
    LoginManager.getInstance().logInWithReadPermissions(this, permissions);

    这里写图片描述

    没安装应用是会自动使用网页登录

    问题

    1. 获取 token 后 profile 为 null

    Profile 不是立即更新的,还得等他更新

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        callbackManager = CallbackManager.Factory.create();
    
        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(
                    Profile oldProfile,
                    Profile currentProfile) {
                // App code
            }
        };
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        profileTracker.stopTracking();
    }

    放到 getToken 之后,等 profile 更新了再获取内容

    2. 权限

    刚注册的应用默认只有 “public_profile”, “email”, ” user_friends”, 对应的就是个人信息和好友信息

    但 user_friends 只有好友数量信息而已,其他信息则需要申请额外权限,调用其他接口获取

    3. 退出

    LoginManager.getInstance().logOut();

    4. 接口访问

    sdk 并没有封装所有的接口,只提供了类似 asyncHttp 的 http 访问工具类,通过sdk只能获取基本信息,更多数据则需要自己访问接口

    具体的接口信息都在 https://developers.facebook.com/docs/graph-api

    比如用户好友信息

    public class UserFriendsRequest {
    
        public static void makeRequest(GraphRequest.Callback callback) {
            String userId = Profile.getCurrentProfile().getId();
            String endPoint = String.format("/%s/friends", userId);
    
            GraphRequest request = new GraphRequest(
                    AccessToken.getCurrentAccessToken(),
                    endPoint,
                    null,
                    HttpMethod.GET,
                    callback
            );
            request.executeAsync();
        }
    } 

    然后判断错误,json 转 obj 就可以了

    mCallback = new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse response) {
                if (response.getError() == null) {
                    UserFriendsResp userFriendsResp = parse(response.getRawResponse());
                    if (userFriendsResp != null) {
                        mGetUserFriendsResponse.onCompleted(userFriendsResp);
                        return;
                    }
                }
    
                mGetUserFriendsResponse.onError();
            }
        };
    展开全文
  • 这个免费的Facebook Pixel扩展程序允许您通过将事件发送到Facebook Ads Manager和Facebook Analytics仪表板来跟踪访问者的行为,这些事件可用于分析转化渠道的有效性并计算广告投资回报率。 此扩展名也与兼容。 ...
  • 由于无法访问Facebook数据库,因为它会变紫,因此条款和条件使我使用了Firefox开源应用程序,因此我可以自由地对其进行修改。 所以我的目标是创建一个Facebook无法禁止的扩展。 facebook成立于2004年。但是仍然没有...
  • 类固醇上的Facebook 我喜欢如何为带来全新的可定制性,灵活性... 命令栏,简称CMDBar,是访问Facebook不同部分,导航到页面/组/朋友,执行FOS命令等的快速方法。 CMDBar使用模式系统来访问不同的功能。 每个模式都有
  • 每次您访问Facebook时,它都会在自己的容器中打开,与您访问的其他网站分开。 您可以在其容器中登录Facebook。 在容器外浏览时,Facebook无法轻松收集您的浏览数据并将其连接到您的Facebook身份。 如何启用Facebook...
  • Facebook/atc环境搭建总结

    千次阅读 2015-07-06 01:14:35
    我已经把facebook预设的几个profile全部添加了,现在可以随意切换了。哈哈。一个字:酸爽! 如何切换 当你选择profile后面的Select按钮后(下面的),节目上的开关按钮旁边会出现一个 Update Shaping 按钮,...

    atc工具的环境搭建分2个主要部分:Wifi热点共享和Atc环境搭建

    环境

    系统:OS X 10.10.3
    VM:virtualBox
    Linux:ubuntu 14.04

    Wifi热点搭建

    参考文章:
    在Ubuntu12.04上使用hostapd和dhcp3-server建Wi-Fi AP
    在Virtualbox的Ubuntu上创建无线(WiFi)热点

    USB无线网卡的选择

    水星(Mercury)MW150U 150M无线USB网卡:遵循 IEEE 802.11b/g/n标准,免驱,直接可以用。我刚开始用的360wifi,需要自己编译驱动,我放弃了。恒温推荐了这个,就花了30块买了个。有了无线wifi,就可以进行下面的活动了,用lsusb命令可以看到我们的usb无线网卡的信息:
    这里写图片描述
    f201:5370就是我们的无线网卡的信息,说明我们识别出我们的usb无线网卡。

    安装hostapddhcpd

    udo apt-get install hostapd isc-dhcp-server

    查看安装是否成功:

    这里写图片描述

    这里写图片描述

    看到上面的信息,说明两个工具安装成功了。

    hostapd.conf创建

    在任意位置创建hostapd.conf文件,我在/etc/hostapd目录下新建该文件,文件内容如下:

    这里写图片描述

    其中ssidwpa_passphrasewifi的用户名和密码,随意设置,其他的配置都是三两相同的。配置完信息后,我们来验证一下是否有效果,执行sudo hostapd -B /etc/hostapd/hostapd.conf
    这里写图片描述

    我使用-B参数,让hostapd在后台运行。也可以采用-d参数启动。

    WLAN soft blocked问题

    如果启动的时候报错信息如下:

    这里写图片描述

    由于我已经启动过了该wifi,需要先解锁该无线设备,再用sudo执行该命令

    sudo rfkill unblock wlan
    sudo hostapd -B /etc/hostapd/hostapd.conf

    再重启

    如果你已经使用sudo hostapd -B /etc/hostapd/hostapd.conf,执行的时候可能会报如下错误:

    这里写图片描述

    我们就需要先执行sudo killall hostapd然后再执行hostapd -B命令

    这里写图片描述

    ok,我们已经启动了hostapd。

    dhcpd.conf的设置

    /etc/dhcp/dhcpd.conf文件中最后一行加入如下信息:

    subnet 192.168.0.0 netmask 255.255.255.0
    {
        range 192.168.0.2 192.168.0.10;
        option routers 192.168.0.1;
        option domain-name-servers 8.8.8.8;
    }

    我用nmcli dev list iface eth0 | grep IP4命令得到我的DNS的信息为192.168.1.1,所以我的dhcpd.conf文件的信息如下:

    这里写图片描述

    设置无线网卡

    ifconfig命令

    设置前

    这里写图片描述

    可以看出只有eth0和lo两个网络设备信息。

    设置wlan0

    sudo ifconfig wlan0 192.168.0.1 netmask 255.255.255.0

    设置后

    这里写图片描述

    可以看出多了一个wlan0无线设备。成功。

    启动dhcp-server

    sudo dhcpd wlan0 -pf /var/run/dhcp-server/dhcpd.pid

    如果出现以下问题:

    这里写图片描述
    说明dhcpd.pid文件不存在,我们去/var/run/dhcp-server目录下自己创建一个dhcpd.pid该文件,然后再执行就可以启动dhcp-server服务。

    这里写图片描述

    IP转发

    sudo bash -c "echo 1 >/proc/sys/net/ipv4/ip_forward"

    设置NAT

    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    连接autotest WIFI

    至此我们已经的wifi热点设置全部完成,打开你的手机,有没有看到你的wifi了呢?如果没有,不用担心,再执行一遍sudo hostapd -B /etc/hostapd/hostapd.conf 就可以了。
    这里写图片描述

    ATC工具的配置

    参考文章
    github
    Facebook网络环境模拟工具ATC的使用

    ATC工具的配置相比wifi热点共享简单很多,照着github上来就可以了。

    启动atc

    sudo atcd --atcd-wan eth0 --atcd-lan wlan0

    这里写图片描述

    启动atc profile配置界面

    python manage.py runserver 0.0.0.0:8000

    这里写图片描述

    链接atc profile配置界面

    这里写图片描述

    我已经把facebook预设的几个profile全部添加了,现在可以随意切换了。哈哈。一个字:酸爽!

    如何切换

    当你选择profile后面的Select按钮后(下面的),节目上的开关按钮旁边会出现一个Update Shaping按钮,点击一下,你的网络就会变成你选择的profile所设置的网络环境。

    这里写图片描述

    当然别忘了打开Turn On按钮。

    展开全文
  • 从2005年到2008年初,MySpace是世界上访问量最大的社交网站,并在2006年6月超过Google成为美国访问量最大的网站,但是MySpace无法管理其网络上的用户体验质量,并开始失去客户到FacebookFacebook创始人兼首席...
  • 今天早上Facebook发生宕机事故,导致你们中的很多人不能访问本站达2.5小时左右。这是我们在4年里遇到的最严重的一次宕机事故,我们首先要对这次事件表示歉意。我们同时也想把这次事故发生的更详细的技术内幕透露出来...
  • 关于Facebook和Google+授权登录

    千次阅读 2018-03-21 13:25:00
    实际中遇到需要Facebook和Google+等第三方授权登录自己的Web应用(可能还有Android和IOS的手机应用),本质上都是JS SDK的官方应用。这时候不得不去他们官方查看文档。 注:一下所有连接如果无法打开,请自行翻Q........
  • facebook 个人账户Online services are becoming increasingly concerned with security, with two-factor authentication now being the flavor of the day. Extra security at login is great, but what if you ...
  • 获取访问令牌您的Facebook帐户 帐户信息 :white_heavy_check_mark: 查看您的帐户信息 转储ID :white_heavy_check_mark: 检索您朋友的所有ID数据 转储电子邮件 :white_heavy_check_mark: 检索您朋友的所有...
  • fbRads:使用此客户端库访问其营销API来分析和管理R中的Facebook广告
  • facebook-ios-sdk, 用于将iOS应用程序与Facebook平台集成 用于iOS的这个开源库允许你将Facebook集成到你的iOS应用程序中。...访问源代码以及在 https://developers.facebook.com/docs/ios 应用程序中
  • 适用于PHP的Facebook商业SDK 介绍 Facebook 是一站式商店,可帮助我们的合作伙伴更好地为他们的企业提供服务。 合作伙伴正在使用多个Facebook API来满足其客户的需求... 要管理Marketing API,请访问您的然后将Marketi
  • 接入Facebook的那些坑(精)

    万次阅读 2017-01-04 10:53:35
     之前工作需要在手游中接入了facebook,并以此写了《手游接入Facebook功能》的博文。当时facebook sdk的版本还是3.x,代码集成度比较低,集成起来也比较麻烦。文中只是稍微提了下功能,然后扔了个github的demo...
  • 本系列文章(共分三部分)将为你介绍基于Facebook和Flash平台的应用程序架构,...你访问Facebook上的某个应用(通常是因为收到朋友邀请,或搜索某个应用时得到一个链接)时,Facebook服务器会将请求转发给你的应用服
  • 答:您可以放心,Facebook的照片缩放功能根本不会访问,查看,使用,操纵甚至关心您的任何数据,历史记录或隐私信息。 PZ4FB需要一定的权限才能正确运行,而Google只是告诉你PZ4FB可以访问你的数据,而不是它。绝对...
  • * 判断是否FaceBook内部访问 * @return bool 为true表示内部访问 * @author danye.cc BerTang 2017-08-16 */ function is_facebook () { $face = false ; //来路域名判断 if (strpos( $_...
  • 只需单击一下,该工具即可自动进行房屋清洁,从而拒绝广告客户访问Facebook不断为您生成的所有类别。 在广告流中,您可以跟踪清除了哪些类别以及随着时间的推移看到的目标广告。 专为Firefox和Chrome构建。 安装...
  • Facebook_Data_Mining 在Facebook页面上下载所有公开帖子要求: ->已安装Python 3->已安装json,请求,字符串,... arg [3]:从任何典型的Facebook帐户访问令牌(有关更多详细信息,请打开developer.facebook.com)。
  • 允许未注册的Facebook用户访问论坛的帖子。 看起来怎么样 Unfacebookify会在每个帖子中显示一个包含消息和评论的框。 特征 显示带有个人资料图片的帖子和评论,显示链接以及电子邮件地址 缓存(配置中的最大和最小...
  • 检查Hosts文件是否设置过ipv6之类的。
  • 隐藏联系人列表的Facebook聊天 Esconde contatos da lista聊天Facebook sem bloquear o contato。 在线聊天,在线聊天,或在线聊天。 Atenção:在线购买Esta可扩展产品,可在线购买,下载或下载Portato Aindaé...
  • 使用OAuth 2.0 API通过访问令牌进行身份验证的策略。 该模块使您可以在Node.js应用程序中使用Facebook进行身份验证。 通过插入Passport,可以轻松,毫不费力地将Facebook身份验证集成到任何支持风格中间件(包括...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,591
精华内容 32,636
关键字:

怎么访问facebook