【问题标题】:Graph API - Get events by owner/creatorGraph API - 按所有者/创建者获取事件
【发布时间】:2010-06-08 21:20:20
【问题描述】:

Facebook Graph API 有没有办法获取由单个配置文件创建的所有事件的列表?我们的客户创建了一堆事件,我们想要提取所有事件的列表。我说他们只需要确保他们将自己设置为参加活动,因为这样我可以轻松地拉出 profileId 参加的活动列表,但我很好奇是否还有其他方法。也许是 FQL 查询?他们看起来需要对主键进行查询。如果这样做的话,FQL 查询会是什么样子?

【问题讨论】:

    标签: events facebook facebook-fql facebook-graph-api


    【解决方案1】:

    我基本上使用了@jh​​chen 提供的FQL。但是,我花了大约 6 个小时才弄清楚如何使用 FQL。所以我想,我会为你提供一个工作脚本。它并不完美,所以如果您发现错误,请更新它。

    1. 下载Facebooks PHP SDK
    2. 添加YOUR_APP_ID
    3. 添加YOUR_APP_SECRET
    4. 添加PAGE_ID
    5. FQL 语句进行您认为合适的更改。 FQL Documentation

    除此之外,您应该一切顺利。另外,我将默认时区设置为America/Los_Angeles。这可能会给你们中的一些人带来问题,如果有人有更好的方法来处理时区,请告诉我。

    PHP 代码:

    <?php
    require_once("php/facebook.php");
    
    date_default_timezone_set('America/Los_Angeles');
    
    function display_events()
    {
        $app_id = 'YOUR_APP_ID';
        $secret = 'YOUR_APP_SECRET';
        $page_id = 'PAGE_ID';
    
        $config = array();
        $config['appId'] = $app_id;
        $config['secret'] = $secret;
        $config['fileUpload'] = false; // optional
    
        $facebook = new Facebook($config);
    
        $fql = 'SELECT 
                    eid, 
                    name, 
                    pic_square, 
                    creator,
                    start_time,
                    end_time
                FROM event 
                WHERE eid IN 
                    (SELECT eid 
                        FROM event_member 
                        WHERE uid='.$page_id.'
                    ) 
                AND end_time >= ' . mktime() . '
                ORDER BY start_time ASC
        ';
    
        $ret_obj = $facebook->api(array(
            'method' => 'fql.query',
            'query' => $fql,
        ));
    
        $html = '';                            
        foreach($ret_obj as $key)
        {
            $facebook_url = 'https://www.facebook.com/event.php?eid=' . $key['eid'];
    
            $start_time = date('M j, Y \a\t g:i A', $key['start_time']);
            $end_time = date('M j, Y \a\t g:i A', $key['end_time']);
    
            $html .= '
                <div class="event">
                    <a href="'.$facebook_url.'">
                        <img src="'.$key['pic_square'].'" />
                    </a>
                    <span>
                        <a href="'.$facebook_url.'">
                            <h2>'.$key['name'].'</h2>
                        </a>
                        <p class="time">'.$start_time.'</p>
                        <p class="time">'.$end_time.'</p>
                    </span>
                </div>
            ';
        }
    
        echo $html;
    }
    

    【讨论】:

    • 我不再需要这样做,也没有时间测试它,但如果你花了 6 个小时,我会假设它可以工作。谢谢!
    • 不能使用事件本身的时区字段吗?
    • 如果它有该字段可用,我不明白为什么不这样做。很久没看这个剧本了。抱歉,我无法提供更多帮助。
    【解决方案2】:

    您可以使用 FQL。仅仅使用创建者作为你的 where 子句是行不通的,因为创建者是不可索引的。但是,一种解决方法是包含一个可索引的 where 子句并另外添加创建者。例如:

    SELECT eid, name, pic, creator FROM event WHERE eid IN (SELECT eid FROM event_member WHERE uid=12345) AND creator=12345

    【讨论】:

      【解决方案3】:

      这是“没有好办法从这里到达那里”的问题之一。您不能使用 FQL,因为创建者列没有被索引。目前我能想到的最佳解决方案是使用 Graph API 来查询创建者的事件连接,并过滤掉他们不是创建者的任何事件。这不会非常有效,因为您将下载有关所有用户事件的信息,即使是他们没有创建的事件。因此,我尝试将其分解为两个查询:

      graph.facebook.com/[user_id]/events?fields=id,owner&limit=1000
      

      然后一旦你过滤掉了他们没有创建的所有事件:

      graph.facebook.com/?ids=[event_ids for the user's events]
      

      【讨论】:

      • 您可以使用 FQL,其中带有 where eid in (select eid from event_member where uid=<...>) 子句,如 jcmoney 所述。
      【解决方案4】:

      zechdc 的答案很完美,但我只需要添加 strtotime 即可让 start_time 工作。

      $start_time = date('M j, Y \a\t g:i A', strtotime($key['start_time']));
      $end_time = date('M j, Y \a\t g:i A', strtotime($key['end_time']));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2022-09-27
        • 2018-11-23
        • 2022-08-21
        • 1970-01-01
        相关资源
        最近更新 更多