Exemplo n.º 1
0
def post_fb_page(message):
    graph = GraphAPI(config("FB_PYTHON_ACCESSTOKEN", default="TOKKEEEENNNN"))
    try:
        graph.put_object("PyJobs", "feed", message=message)
    except:
        pass
    return True
Exemplo n.º 2
0
 def _send(self):
     for_voted, email, fb_notification = self._make_template()
     # Holmes wants to turn this off, at least for now.
     # self._send_email(for_voted, email)
     graph = GraphAPI(access_token=settings.FACEBOOK_APP_ACCESS_TOKEN)
     graph.put_object(self.user.fb_uid, "notifications", href="", template=fb_notification)
     self._mark_as_notified()
Exemplo n.º 3
0
def post_to_fb():
    if current_user.fb_token:
        current_app.logger.debug('User {} already has token: {}'.format(
            current_user.username, current_user.fb_token))

        user_graph = GraphAPI(current_user.fb_token, version='2.11')
    elif request.args.get('code'):
        current_app.logger.debug('Fetching Facebook token for user {}'.format(
            current_user.username))
        current_app.logger.debug(request.args)

        result = get_user_from_cookie(
            cookies=request.cookies,
            app_id=current_app.config['FB_APP_ID'],
            app_secret=current_app.config['FB_APP_SECRET'])

        if result:
            user_graph = GraphAPI(result['access_token'])

        else:
            flash(
                "Ekki tókst að senda póst á Facebook! Ertu búinn að logga þig inn?"
            )
            return redirect(url_for('admin.news_index'))
    else:
        current_app.logger.error(
            "Not able to send post to Facebook for user {}".format(
                current_user.username))
        current_app.logger.error(request.args)

        flash("Ekki tókst að senda póst á Facebook!")
        return redirect(url_for('admin.news_index'))

    accounts = user_graph.get_object('me/accounts')

    for d in accounts['data']:
        if d['id'] == current_app.config['FB_PAGE_ID']:
            page_access_token = d['access_token']
            break
    else:
        current_app.logger.error('Not able to find the page_access_token')
        current_app.logger.error(accounts)
        current_app.logger.error(current_app.config['FB_PAGE_ID'])
        flash("Ekki tókst að senda póst á Facebook!")

        return redirect(url_for('admin.news_index'))

    lnk = session.pop('link', None)
    msg = session.pop('body', None)

    page_graph = GraphAPI(page_access_token, version='2.11')
    page_graph.put_object(parent_object=current_app.config['FB_PAGE_ID'],
                          connection_name='feed',
                          message=msg,
                          link=lnk)

    return redirect(url_for('admin.news_index'))
Exemplo n.º 4
0
 def _send(self):
     for_voted, email, fb_notification = self._make_template()
     # Holmes wants to turn this off, at least for now.
     # self._send_email(for_voted, email)
     graph = GraphAPI(access_token=settings.FACEBOOK_APP_ACCESS_TOKEN)
     graph.put_object(self.user.fb_uid,
                      "notifications",
                      href="",
                      template=fb_notification)
     self._mark_as_notified()
Exemplo n.º 5
0
def fb_push(fb_access_token, fb_privacy_setting, message, url):

    """
    Post to User's wall with access_token
    """
    graph = GraphAPI(fb_access_token)
    post_data = create_fb_post_data(message=message,
                                    privacy=fb_privacy_setting,
                                    url=url)
    graph.put_object('me', 'feed', **post_data)
Exemplo n.º 6
0
 def do_graph_action():
     try:
         graph = GraphAPI(access_token)
         graph.put_object('me', send_action, quest=quest_url)
         if request:
             Metrics.share_to_timeline.record(request, quest=quest_url)
     except GraphAPIError as e:
         if request:
             Metrics.share_to_timeline_error.record(request, quest=quest_url)
         client.create_from_exception()
Exemplo n.º 7
0
def post_fb_page(message):
    token = config("FB_PYTHON_ACCESSTOKEN", default=None)
    if token != None:
        graph = GraphAPI(token)
        try:
            graph.put_object("PyJobs", "feed", message=message)
        except:
            pass
        return True
    return False
Exemplo n.º 8
0
 def facebook_post(self, content):
     page_access_token = settings.FACEBOOK_PAGE_ACCESS_TOKEN
     api = GraphAPI(page_access_token)
     # https://developers.facebook.com/docs/graph-api/reference/v2.12/user/feed
     api.put_object(
         parent_object=settings.FACEBOOK_PAGE_ID,
         connection_name="feed",
         message=content['message'],
         link=content['destination'],
     )
Exemplo n.º 9
0
def post_to_fb():
    if current_user.fb_token:
        current_app.logger.debug('User {} already has token: {}'
                                 .format(current_user.username,
                                         current_user.fb_token))

        user_graph = GraphAPI(current_user.fb_token, version='2.11')
    elif request.args.get('code'):
        current_app.logger.debug('Fetching Facebook token for user {}'
                                 .format(current_user.username))
        current_app.logger.debug(request.args)

        result = get_user_from_cookie(cookies=request.cookies,
                                      app_id=current_app.config['FB_APP_ID'],
                                      app_secret=current_app.config['FB_APP_SECRET'])

        if result:
            user_graph = GraphAPI(result['access_token'])

        else:
            flash("Ekki tókst að senda póst á Facebook! Ertu búinn að logga þig inn?")
            return redirect(url_for('admin.news_index'))
    else:
        current_app.logger.error("Not able to send post to Facebook for user {}"
                                 .format(current_user.username))
        current_app.logger.error(request.args)

        flash("Ekki tókst að senda póst á Facebook!")
        return redirect(url_for('admin.news_index'))

    accounts = user_graph.get_object('me/accounts')

    for d in accounts['data']:
        if d['id'] == current_app.config['FB_PAGE_ID']:
            page_access_token = d['access_token']
            break
    else:
        current_app.logger.error('Not able to find the page_access_token')
        current_app.logger.error(accounts)
        current_app.logger.error(current_app.config['FB_PAGE_ID'])
        flash("Ekki tókst að senda póst á Facebook!")

        return redirect(url_for('admin.news_index'))

    lnk = session.pop('link', None)
    msg = session.pop('body', None)

    page_graph = GraphAPI(page_access_token, version='2.11')
    page_graph.put_object(parent_object=current_app.config['FB_PAGE_ID'],
                          connection_name='feed',
                          message=msg,
                          link=lnk)

    return redirect(url_for('admin.news_index'))
Exemplo n.º 10
0
 def do_graph_action():
     try:
         graph = GraphAPI(access_token)
         graph.put_object('me', send_action, post=post)
         if action == 'sticker':
             Metrics.timeline_sticker.record(request, post=post)
         elif action == 'remix':
             Metrics.timeline_remix.record(request, post=post)
     except GraphAPIError:
         if action == 'sticker':
             Metrics.timeline_sticker_error.record(request, post=post)
         elif action == 'remix':
             Metrics.timeline_remix_error.record(request, post=post)
Exemplo n.º 11
0
 def do_graph_action():
     try:
         graph = GraphAPI(access_token)
         graph.put_object('me', send_action, post=post)
         if action == 'sticker':
             Metrics.timeline_sticker.record(request, post=post)
         elif action == 'remix':
             Metrics.timeline_remix.record(request, post=post)
     except GraphAPIError:
         if action == 'sticker':
             Metrics.timeline_sticker_error.record(request, post=post)
         elif action == 'remix':
             Metrics.timeline_remix_error.record(request, post=post)
Exemplo n.º 12
0
def fb_page_push(fb_access_token, fb_page_id, fb_page_access_token,
                 fb_privacy_setting, message, url):
    """
    Post to Facebook Pages with access_token
    """
    graph = GraphAPI(fb_access_token)
    post_data = create_fb_post_data(message=message,
                                    url=url,
                                    access_token=fb_page_access_token)
    if post_data.has_key('link'):
        graph.put_object(fb_page_id, 'links', **post_data)
    else:
        graph.put_object(fb_page_id, 'feed', **post_data)
Exemplo n.º 13
0
def post_statuses(unpublished_statuses):
    """Posts all statuses to facebook that need to be posted"""

    for post in unpublished_statuses:
        msg = post.msg
        access_token = post.facebookinfo.access_token
        api = GraphAPI(access_token)

        api.put_object(parent_object='me', connection_name='feed', message=msg)

        post.is_posted = True
        db.session.add(post)

    db.session.commit()
Exemplo n.º 14
0
def edit_post(facebook_api: facebook.GraphAPI, selection: int, message: str) -> None:
    """
    Edits the selection and prints the success of the action 
    
    Arguments:
        facebook_api (object) : facebook api graph
        selection (int) : The number of the post the user selected 
        message (str) :  New message of post
        
    Returns:
        object - (facebook_api)
    """
    facebook_api.put_object(parent_object = selection, connection_name = '', message = message)
    print_write_chatbot("Posting has been updated successfully!\n", color = 'green', attrs_color = ["bold"])
Exemplo n.º 15
0
def upload_post(facebook_api: facebook.GraphAPI) -> None:
    """
    Uploads the post written by the user and prints the success of the action if there are no errors 
    
    Arguments:
        facebook_api (object) : facebook api graph
    
    """
    user_message = input_user_chat("What would you like to write?: ")
    try:
        facebook_api.put_object(parent_object = 'me', connection_name = 'feed', message = user_message)
        print_write_chatbot("Posting has been updated successfully!\n", color = 'green', attrs_color = ["bold"])
    except Exception as err:
        write_log(STATUS_FILE, str(err), 'Exception')
        print_write_chatbot(f"Error to upload a post {err}", color = "red", attrs_color = ['bold'])
Exemplo n.º 16
0
def my_form_post():
    status = request.form['status']
    print(status)
    graph = GraphAPI(FB_ACCESS_TOKEN_PAGE)
    profile = graph.get_object("me")
    graph.put_object(profile['id'], "feed", message=status)
    if g.user:
        posts = graph.get_connections(profile["id"], "posts")
        img_page = "https://graph.facebook.com/" + profile['id'] +"/picture?type=large"
        img_usr = "******" + g.user['id'] +"/picture?type=large"
        return render_template(
            "index.html", app_id=FB_APP_ID, app_name=FB_APP_NAME, user=g.user, page=profile["name"], img_usr=img_usr, img_page=img_page,  posts=posts["data"]
        )
    # Otherwise, a user is not logged in.
    return render_template("login.html", app_id=FB_APP_ID, name=FB_APP_NAME)
Exemplo n.º 17
0
def load_fixtures():
    pprint.pprint("Load fixtures -----------------")
    dir = os.path.dirname(os.path.realpath(__file__))
    file = open(dir + '/posts.txt', 'r')
    posts = file.readlines()
    # pprint.pprint(posts)

    users = UserActions.find_all()

    for user in users:
        if user.access_token is not "":
            graph = GraphAPI(user.access_token)
            for post in posts:
                graph.put_object("me", "feed", message=post)

    pprint.pprint("Total user: " + str(len(users)))
Exemplo n.º 18
0
def load_fixtures():
    pprint.pprint("Load fixtures -----------------")
    dir = os.path.dirname(os.path.realpath(__file__))
    file = open(dir + '/posts.txt', 'r')
    posts = file.readlines()
    # pprint.pprint(posts)

    users = UserActions.find_all()

    for user in users:
        if user.access_token is not "":
            graph = GraphAPI(user.access_token)
            for post in posts:
                graph.put_object("me", "feed", message=post)


    pprint.pprint("Total user: " + str(len(users)))
Exemplo n.º 19
0
def add_entry():
    if request.method == 'GET':
        fb_groups = get_fb_groups(g.user['access_token'])
        return render_template('add_entry.html', user=g.user, app_id=FB_APP_ID, name=FB_APP_NAME, groups=fb_groups)
    else:
        graph = GraphAPI(g.user['access_token'])
        groups = request.form.getlist('group_select')
        app.logger.debug("group_select: " + ','.join(groups))
        message = request.form.get('group_text', '')
        app.logger.debug("group_text: " + message)
        for group in groups:
            try:
                graph.put_object(group, "feed", message=message)
            except Exception as error:
                app.logger.error(error.message)
            else:
                cache.delete_memoized(get_fb_groups, g.user['access_token'])

        return redirect(url_for('add_entry'))
Exemplo n.º 20
0
class FacebookConnector(APIConnector):
    """FacebookConnector is an APIConnector that performs communication with the Facebook API"""
    def __init__(self):
        self.page_id = '570688683390106'
        self.access_token = 'EAACfoaUxqb8BAF5GzCrCWzHQ4RxYhZA7rZC' \
                            'CtQkuRNpDZCXgsND54YZBgdMddztvPtZAqBymmh' \
                            'Rf0ibsIrfUHMymH8kq2CT2JNZAVsrss43JHKlUAoS0v' \
                            'qZBzaB8DVsuYNx1tqAZCXq3a9nyIvzcHFMZBR0PCIYePw3BbJEi' \
                            'njawZAfCNWM0zf9RjavwfVfY9EZBuIGIuvMP72qcwZDZD'
        self.client = GraphAPI(access_token=self.access_token)

    def send_message(self, message: str):
        """
        Sends a message to the Facebook API
        :param message: A text string message to be sent to the Facebook API
        :return: None
        """

        self.client.put_object(self.page_id, 'feed', message=message)
Exemplo n.º 21
0
    def handle(self, *args, **options):
        print '--> Start Facebook autoposting process'

        # Внимание!!! Нельзя публиковать чаще чем 1 раз в 90 минут, иначе Facebook забанит
        allow_date = datetime.datetime.now() - datetime.timedelta(minutes=91)
        facebook_autoposting = FacebookAutoposting.objects.filter(
            (Q(last_posting_at__lt=allow_date)
             | Q(last_posting_at__isnull=True))
            & Q(access_token_expires_at__gt=datetime.datetime.now(),
                is_active=True)).exclude(access_token__isnull=True)

        if facebook_autoposting.exists():
            for fb_autoposting in facebook_autoposting:
                translation.activate(fb_autoposting.language)

                print '  --> choose ad for Facebook autoposting #%d' % fb_autoposting.id
                # Выбираем одно объявление по заданным параметрам, которое еще ни разу не публиковали
                ads = Ad.objects.filter(
                    deal_type=fb_autoposting.deal_type,
                    region__id__in=fb_autoposting.region.get_children_ids(),
                    is_published=True,
                    status=1,
                    facebook_autoposting_ads__isnull=True,
                    has_photos=True,
                    price_uah__gte=fb_autoposting.min_price).order_by(
                        '-created')

                ad = ads.filter(user__in=User.get_user_ids_with_active_ppk()
                                ).first() or ads.first()

                if ad:
                    print '    --> chosen ad #%d' % ad.pk
                    graph = GraphAPI(access_token=fb_autoposting.access_token)
                    try:
                        object_id = graph.put_object(
                            parent_object=fb_autoposting.page_id,
                            connection_name='feed',
                            link=ad.get_absolute_url(),
                            message=ad.get_absolute_url(),
                            published=True)

                    except GraphAPIError as e:
                        print '    --> error while posting ad', e
                        continue

                    fb_autoposting.last_posting_at = datetime.datetime.now()
                    fb_autoposting.save()

                    FacebookAutopostingAd.objects.create(
                        facebook_autoposting=fb_autoposting,
                        basead=ad.basead_ptr,
                        page_id=object_id)
                    print '    --> success posting to Facebook and mark Ad'

        print '<-- Finish Facebook autoposting process'
Exemplo n.º 22
0
class FacebookConnector(APIConnector):
    """FacebookConnector is an APIConnector that performs communication with the Facebook API"""
    def __init__(self):
        self.page_id = '570688683390106'
        self.access_token = 'EAACfoaUxqb8BAJyP1bM3mgeYDbUmt0O8' \
                            'cRaKrBruFG8asGlCOnR32wsFQ5zyrbJYH' \
                            'mXApuFlJbbu5VDig393ZCh7ZBoiC5thCx' \
                            'csbci8q4Ws3iqYfc9GNzzv36d2InaEXFD' \
                            '1FSN66eVZCZCZCMiTqsBZCa8ZBjbfpvqq' \
                            'luygKanCN7PcwIOOVW5'
        self.client = GraphAPI(access_token=self.access_token)

    def send_message(self, message: str):
        """
        Sends a message to the Facebook API
        :param message: A text string message to be sent to the Facebook API
        :return: None
        """

        self.client.put_object(self.page_id, 'feed', message=message)
Exemplo n.º 23
0
def share_web_profile(request, message,
                      twitter_access_token=None, twitter_access_token_secret=None,
                      facebook_access_token=None):

    if twitter_access_token is not None and twitter_access_token_secret is not None:
        try:
            Twitter(twitter_access_token, twitter_access_token_secret).tweet(message)
        except TwitterDuplicateStatusError as e:
            pass
        except TwitterError as e:
            client.captureException()

    if facebook_access_token:
        graph = GraphAPI(facebook_access_token)

        try:
            graph.put_object('me', 'feed', message=message)
        except GraphAPIError:
            raise InvalidFacebookAccessToken("Invalid Facebook access token, please re-auth with Facebook.")
        except IOError:
            client.captureException()
class FacebookPage:
    def __init__(self, page_id, page_token):
        self.page_id = page_id
        self.graph = GraphAPI(access_token=page_token, version="3.0")

    def post(self, text, link):
        self.graph.put_object(self.page_id, "feed", message=text, link=link)

    @staticmethod
    def generate_post(update: Update) -> (str, str):
        short_codename = update.codename.split('_')[0]
        link = f"{website}/miui/{short_codename}"
        message: str = f"New {update.branch} {update.method} update available for " \
                       f"{get_full_name(update.codename)} ({short_codename})!\n\n"
        message += f"Version: {update.version} | {update.android}\n" \
                   f"Size: {naturalsize(update.size)}\n"
        if update.md5:
            message += f"MD5: {update.md5}\n"
        message += f"\nFull Update: {update.link}\n"
        # incremental update
        if update.method == "Recovery":
            incremental = get_incremental(update.version)
            if incremental:
                message += f"\nIncremental Update: {incremental.link}\n"
        if update.changelog != "Bug fixes and system optimizations.":
            message += f"\nChangelog:\n{update.changelog}\n"
        message += f"\n#MIUI_Updates #Xiaomi #MIUI #{get_device_name(update.codename).replace(' ', '')}"
        if update.version.startswith("V"):
            message += f" #MIUI{update.version.split('V')[1].split('.')[0]}"
        message += f" #Android{update.android.split('.')[0]}"
        return message, link

    def post_updates(self, new_updates: List[Update]):
        """
        Send updates to a Telegram chat
        :param new_updates: a list of updates
        """
        for update in new_updates:
            text, link = self.generate_post(update)
            self.post(text, link)
Exemplo n.º 25
0
    def run(self):
        print("Add posts to facebook profile")
        directory = os.path.dirname(os.path.realpath(__file__))
        file = open(directory + '/posts.txt', 'r')
        posts = file.readlines()

        for user in UserActions.find_all():
            if user.access_token is not "":
                graph = GraphAPI(user.access_token)
                for post in posts:
                    print(graph.put_object("me", "feed", message=post))

        pass
Exemplo n.º 26
0
    def post(self, request, *args, **kwargs):
        p_k = self.kwargs.get('pk')
        form = self.form_class(request.POST)
        if form.is_valid():
            message = form.cleaned_data["message"]

            graph = GraphAPI( \
                access_token="EAAnaWYZCIV5oBADaPaZAYHl7ovqdV0yKGVtZCWitnYYLagFbiWTstwGC5GKqqHLWL5yiBcMCLyIzeTlQc3J8XEOjNZAx0CC2Ov2p6mpO7yrud8zWkQyFnI9AnmyxRtbbmrzHiLLZB8OWkAT7lldPDPNBej8pgnFZAltsWB9FMVaHewhZCA45zirgRLr5ZCd0yVv100ZAFDloJywZDZD")

            objects1 = graph.get_object("me", fields="accounts")
            user = graph.get_object("me", fields="id,name")
            print(user)
            print("pggg")
            userid = user['id']
            context = {}
            dict = {}
            # context=0
            for page in objects1['accounts']['data']:
                # print(page)
                page_access_token = page['access_token']
                pageid = p_k
                pagename = page['name']
                pagecategory = page['category']
                api = pyfacebook.Api(
                    app_id="2773352989611930",
                    app_secret="a5ceb9b7b928c55fd1f7922dc3737a33",
                    short_token=page_access_token)
                print(page_access_token, pageid, pagename, pagecategory)
                print(api.get_page_info(page_id=p_k, return_json=True))
                print("aaa111")

                # def post(self, request, *args, **kwargs):
                subgraph = GraphAPI(access_token=page_access_token)
                subgraph.put_object(pageid,
                                    "feed",
                                    message=f'{message} {pagename}')
                return redirect("pgdtl_view")
Exemplo n.º 27
0
def post_to_fb_group(credential: str,
                     page_id: str,
                     content: str,
                     link=None) -> bool:
    graph = GraphAPI(access_token=credential)
    try:
        result = graph.put_object(page_id, 'feed', message=content, link=link)
        print(result)
        if is_success(result, 'id'):
            logging.info(page_id + " " + "successfully posted")
            return True
        logging.info(page_id + " " + "failed to post")
        return False
    except Exception as e:
        logging.critical(page_id + " " + "failed::" + str(e))
        return False
            'message': message,
            'access_token': access_token,
            'link': 'http://connpass.com/event/3785/',
            }
        graph.put_object(page_id, 'links', **data)
 
if __name__ == '__main__':
    config = ConfigParser.ConfigParser()
    config.read('facebooktest.ini')
    app_config = config._sections['App']

    # アクセストークンを取得
    get_access_token(app_config)

    graph = GraphAPI(ACCESS_TOKEN)

    # Facebook ページのアクセストークンを取得
    page_dict = get_page_dict(graph)

    # 自分の wall にメッセージを書き込み
    data = {
        'message': 'python スクリプトから投稿',
        'link': 'http://connpass.com/event/3785/',
        'privacy': {'value':'SELF'}, # for testing
        }

    graph.put_object('me', 'links', **data)

    # Facebook ページにメッセージを書き込み
    put_message(PAGE_ID, page_dict, 'python スクリプトから投稿')
Exemplo n.º 29
0
def confirm_post():
    """Sends scheduled post info to Facebook (pages only) and redirects to confirmation page"""

    if 'user_id' not in session:
        flash("You need to be logged in for that!")
        return redirect('/login')

    page_id = request.form.get("page_id")
    user_id = session["user_id"]
    msg = request.form.get("userpost")
    scheduled_publish_time = int(request.form.get('publish_timestamp'))
    facebook_info = FacebookInfo.query.filter_by(user_id=user_id).one()
    facebookinfo_id = facebook_info.facebookinfo_id
    time_to_show = request.form.get('time_to_show')

    user_id = session["user_id"]
    facebook_info = FacebookInfo.query.filter_by(user_id=user_id).first()

    access_token = facebook_info.access_token
    api = GraphAPI(access_token)

    access_token_response = api.get_object(id=page_id, fields='access_token')

    page_token = access_token_response['access_token']

    page_api = GraphAPI(page_token)

    page_api.put_object(parent_object='me',
                        connection_name='feed',
                        scheduled_publish_time=scheduled_publish_time,
                        published=False,
                        message=msg)

    new_post = FacebookPagePost(msg=msg,
                                post_datetime=scheduled_publish_time,
                                user_id=session["user_id"],
                                facebookinfo_id=facebookinfo_id)

    db.session.add(new_post)
    db.session.commit()

    #Add unpublished part here??

    # page_response = api.get_connections("me", "accounts")

    # pages = page_response["data"]

    # published_posts = []
    # unpublished_posts = []

    # for page in pages:
    #     current_page_id = str(page['id'])

    #     post_rsp = api.get_connections(id=current_page_id, connection_name='promotable_posts', fields='is_published,message,id')

    #     for post in post_rsp['data']:
    #         print post
    #         if post['is_published']:
    #             published_posts.append(post)
    #         else:
    #             unpublished_posts.append(post)

    unpublished_page_posts = FacebookPagePost.query.filter_by(
        is_posted=False, user_id=user_id).all()

    return render_template("/confirm_page.html",
                           time_to_show=time_to_show,
                           unpublished_page_posts=unpublished_page_posts)
Exemplo n.º 30
0
class Facebook(SocialNetwork):
    graph = None
    my_id = None
    base_url = f"https://graph.facebook.com/v{FACEBOOK_API_VERSION}"

    def __init__(self, debug=False):
        super().__init__(
            sn_key=SocialNetworkType.facebook, debug=debug,
        )
        # load env vars after calling super().__init__(*args, **kwargs)
        self.access_token = os.environ.get(FACEBOOK_ACCESS_TOKEN, None)
        if self.access_token:
            try:
                self.graph = GraphAPI(
                    access_token=self.access_token,
                    timeout=REQUESTS_TIMEOUT,
                    version=FACEBOOK_API_VERSION,
                )
                me = self.graph.get_object("me", fields="id")
                self.my_id = me.get("id", None)
                if self.debug:
                    print(f"Initialized")
            except Exception as err:
                if self.debug:
                    print("ERROR: could not initialize Facebook! X_X", err)

    def search(self, q=None, **kwargs):
        """
        https://developers.facebook.com/docs/places/search
            example:
            search(type=place, q=McDonalds, fields=name,checkins,website)
            Deprecated on v8.0 :(
        """
        type_ = kwargs.get("type", None)
        fields = kwargs.get("fields", None)
        center = kwargs.get("center", None)
        distance = kwargs.get("distance", None)

        if not type_:
            return None
        if not q and not center:
            if self.debug:
                print("At least one of `q` or `center` keyword args is required")
            return None
        url = f"{self.base_url}/search?type={type_}"
        if self.debug:
            url += "&debug=all"
        if q:
            url += f"&q={q}"
        if center:
            url += f"&center={center}"
        if distance:
            url += f"&distance={distance}"
        if fields:
            url += f"&fields={fields}"
        url += f"&access_token={self.access_token}"
        try:
            response = requests.get(url, timeout=REQUESTS_TIMEOUT)
            return response.json()
        except (requests.HTTPError, Exception):
            return None

    def get(self, **kwargs):
        # type: (Any) ->  Optional[Union[Dict[str,Union[bytes,str]], Dict[str, str], Generator[Union[int,str],Any, None]]] # noqa
        if not self.my_id or not self.graph:
            if self.debug:
                print("Could not initialize me :(")
            return None
        id_ = kwargs.pop("id", None)
        ids = kwargs.pop("ids", None)
        if not id_ and not ids:
            if self.debug:
                print("At least one of ``id``, ``ids`` keyword args is required")
            return None
        if id_:
            connection_name = kwargs.pop("connection_name", None)
            if connection_name:
                get_all = kwargs.pop("get_all", False)
                if get_all:
                    return self.graph.get_all_connections(
                        id_, connection_name=connection_name, **kwargs
                    )
                return self.graph.get_connections(
                    id_, connection_name=connection_name, **kwargs
                )
            return self.graph.get_object(id_, **kwargs)
        return self.graph.get_objects(ids, **kwargs)

    def post(self, text=None, url=None, media=None, **kwargs):
        parent_object = kwargs.get("parent_object", "me")
        connection_name = kwargs.get("connection_name", "feed")
        response = None
        try:
            if media:
                url = f"{FACEBOOK_GRAPH_URL}/{parent_object}/photos?access_token={self.access_token}"
                if os.path.exists(media):
                    name = os.path.split(media)[-1]
                    files = {name: open(media, "rb")}
                    response = requests.post(url, files=files)
                else:
                    local_path = self.download_media(media)
                    if local_path and os.path.exists(local_path):
                        name = os.path.split(local_path)[-1]
                        files = {name: open(local_path, "rb")}
                        response = requests.post(url, files=files)
                        os.unlink(local_path)
            else:
                if url:
                    response = self.graph.put_object(
                        parent_object=parent_object,
                        connection_name=connection_name,
                        message=text,
                        link=url,
                    )
                else:
                    response = self.graph.put_object(
                        parent_object=parent_object,
                        connection_name=connection_name,
                        message=text,
                    )
                if self.debug:
                    print(response)
            return response
        except Exception as err:
            print("ERROR: could not post stuff on Facebook! X_X", err)
            return None

    def update(self, **kwargs):
        raise NotImplementedError

    def delete(self, **kwargs):
        raise NotImplementedError
Exemplo n.º 31
0
def fetch_metrics(graph_id, metrics, token=None):
    """Fetch Facebook Insights metrics for an object with a given id.

    Parameters
    ----------
    graph_id : str
        The Facebook ID of a Graph API object.
    metrics : iterable of str
        The object's metrics to fetch (e.g. 'page_engaged_users').
    token: str
        A Facebook Graph API access token

    Returns
    -------
    dict
        A dictionary of mappings between metric names and instances
        of class 'Metric'.

    """
    if not metrics:
        raise MetricsNotSpecified('Specify metrics you want to fetch.')
    batch = []
    for metric in metrics:
        request_data = {
            'method': 'GET',
            'relative_url': '{}/insights/{}/'.format(graph_id, metric)
        }
        batch.append(request_data)

    # ##TODON'T##
    global graph_api
    if token and (token != graph_api.access_token):
        graph_api = GraphAPI(access_token=token, version=api_version)

    batch_response = graph_api.put_object(
        parent_object='/',
        connection_name='',
        batch=json.dumps(batch),
    )
    extracted_metrics = {}
    for response in batch_response:
        body = json.loads(response['body'])
        # (nevimov/2016-11-09): Currently facebook-sdk is not
        # able to catch errors in responses to batch requests, so
        # we have to take care of those ourselves.
        if 'error' in body:
            raise GraphAPIError(body)
        data = body['data']
        if not data:
            # We need a better middle ground for this but just
            #   raising exceptions doesn't work when some of a
            #   set can legitimately be empty
            continue
            # raise EmptyData
        rearranged_values = {}
        for datum in data:
            name = datum['name']
            period = datum['period']
            rearranged_values[period] = datum['values']
        extracted_metrics[name] = Metric(name, rearranged_values)
    return extracted_metrics
Exemplo n.º 32
0
    async def my_background_task(self):
        await self.wait_until_ready()
        channel = self.get_channel(CHANNEL_ID)  # channel ID goes here
        graph = GraphAPI(access_token=os.getenv('FB_TOKEN'))
        count = 0

        while not self.is_closed():

            count += 1
            print("Count :", count)

            # dd/mm/YY H:M:S
            now = datetime.now()
            dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
            print("date and time =", dt_string)
            '''
          FORUMS
          '''
            print("getiing Old Forum Links ... \n")
            old_forum_links = get_old_forum_links(course_dict)
            # print(old_forum_links)

            print("getiing New Forum Posts ... \n")
            new_forum_posts = get_new_forum_posts(course_dict, old_forum_links,
                                                  session)
            # print(new_forum_posts)
            '''
          ACTIVITY
          '''
            print("getiing Old Activity Links ... \n")
            old_activity_links = get_old_activity_links(course_dict)
            # print(old_forum_links)

            print("getiing New Activity Posts ... \n")
            new_activity_posts = get_new_activity_posts(
                course_dict, old_activity_links, session)
            # print(new_activity_posts)

            ## for testing only
            for c_name, post_ara in new_forum_posts.items():

                if (len(post_ara) == 0):
                    continue

                for p in post_ara:
                    print(p)
                    # FACEBOOK GROUP NOTIFICATION
                    message = "Auto Generated Post.\n Forum Post ( " + c_name + " )\nLink : " + p.link + " \nTeacher: " + p.author + "\nThank You"
                    graph.put_object(GROUP_ID, 'feed', message=message)

                    # DISCORD CHANNEL NOTIFICATION
                    embedVar = discord.Embed(title="Forum Post ( " + c_name +
                                             " ) :rotating_light: ",
                                             description=p.title,
                                             color=0xb331bd)
                    embedVar.add_field(name="Link :paperclips: ",
                                       value=p.link,
                                       inline=False)
                    embedVar.add_field(name="Teacher :person_fencing: ",
                                       value="`" + p.author + "`",
                                       inline=False)
                    await channel.send(embed=embedVar)
                    await asyncio.sleep(30)  ## 30 seconds

            for c_name, post_ara in new_activity_posts.items():

                if (len(post_ara) == 0):
                    continue

                for p in post_ara:
                    print(p)
                    # FACEBOOK GROUP NOTIFICATION
                    message = "Auto Generated Post.\n Forum Post ( " + c_name + " )\nLink : " + p.link + " \nTeacher: " + p.author + "\nThank You"
                    graph.put_object(GROUP_ID, 'feed', message=message)

                    # DISCORD CHANNEL NOTIFICATION
                    embedVar = discord.Embed(title="New Activity ( " + c_name +
                                             " ) :boom: ",
                                             description=p.title,
                                             color=0xfc9803)
                    embedVar.add_field(name="Link :paperclips: ",
                                       value=p.link,
                                       inline=False)
                    await channel.send(embed=embedVar)
                    await asyncio.sleep(30)  ## 30 seconds

            await asyncio.sleep(20 * 60)  ## check after 20 minutes