我有一个电子邮件地址,想知道是否有Facebook用户链接到此地址。如果有,那么我想检索此用户个人资料页面的网址并将其保存在某处。 我不有一个Facebook应用程序,但是,如果有必要,我会使用现有的帐户数据登录Facebook并执行任务。
我认为这将是一项轻松的任务,但不知何故并非如此。我通读了Graph API文档,在那里您可以找到有关如何搜索公共数据的说明。它说格式是:
https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE
但是,使用 q 参数中的电子邮件地址和类型参数中的用户进行尝试,无需进一步信息即可生成 OAuthException 说“请求此资源需要访问令牌。” 但是,如果您单击示例搜索链接,Facebook将生成一个URL,其中包含与当前登录用户相关的提及的访问令牌。使用此令牌执行搜索可获得预期结果。但我无法弄清楚如何在登录后获得此用户会话访问令牌。每次我搜索如何获取访问令牌时,我只能找到有关Facebook应用程序的信息并检索基本或特定数据访问的权限。正如我所提到的,这不是我想要的,因为我没有,也不需要Facebook应用程序。
由于Facebook在示例链接中提供了所需的令牌,我认为它也不应该成为问题。或者他们只是因为主场优势而拥有它? 此外,Outlook Social Connector Provider for Facebook只能通过电子邮件地址(以及提供的帐户数据)检索Facebook数据。所以我想,如果微软能做到这一点,我也应该做同样的事情。
最后但并非最不重要的是,这更令人沮丧,因为我在理论上和实际上已经能够通过搜索电子邮件地址找到用户个人资料网址。我甚至不必登录Facebook。而且这不是官方的API方式
如果我向http://www.facebook.com/search.php?init=s:email&q=example@domain.com&type=users
执行网络请求,我会收到预期的搜索结果。问题是我必须解析HTML代码并提取网址(这没关系),结果页面可能会发生变化,很容易破坏我的方法来提取网址(有问题)。
那么有人知道完成给定任务的最佳方法是什么?
答案 0 :(得分:15)
对此的明确答案来自Facebook本身。在https://developers.facebook.com/bugs/335452696581712的帖子中,Facebook开发人员说
The ability to pass in an e-mail address into the "user" search type was
removed on July 10, 2013. This search type only returns results that match
a user's name (including alternate name).
所以,唉,简单的答案是你不能再通过他们的电子邮件地址搜索用户了。这很糟糕,但这是Facebook的新规则。
答案 1 :(得分:7)
只需使用此网址格式的图形API: https://graph.facebook.com/search?q=zuck@fb.com&type=user&access_token= ...您可以轻松创建应用here并为其获取访问令牌here。我believe每600秒估计会收到600个请求,但这没有记录。
如果您批量执行此操作,则可以在20个电子邮件地址的批次中使用batch requests。这可能有助于速率限制(我不确定您是否每600秒获得600个批量请求或600个单独请求)。
答案 2 :(得分:7)
针对此处提交的错误:http://developers.facebook.com/bugs/167188686695750 Facebook工程师回复:
这是设计用户,搜索用户只是用户到用户功能,用于寻找新朋友或通过电子邮件搜索以查找Facebook上的现有联系人。 StackOverflow上提到的“抓取”特别违反了我们的服务条款https://www.facebook.com/terms.php,事实上,在Facebook上搜索用户的唯一合法方式就是当您是用户时。
答案 3 :(得分:5)
也许这有点晚了但我找到了一个网站,通过知道电子邮件addreess提供社交媒体帐户详细信息。它是https://www.fullcontact.com
您可以在那里使用Person Api并获取信息。
这是一种获取:https://api.fullcontact.com/v2/person.xml?email=someone@ ****& apiKey = ********
还有xml或json选择。
答案 4 :(得分:3)
我已经捕获了Facebook的Outlook插件通信,这是POST请求
https://api.facebook.com/method/fql.multiquery
access_token=TOKEN&queries={"USER0":"select '0', uid, name, birthday_date, profile_url, pic, website from user where uid in (select uid from email where email in ('EMAIL_HASH'))","PENDING_OUT":"select uid_to from friend_request where uid_from = MY_ID and (uid_to IN (select uid from #USER0))"}
其中
令牌 - 有效的访问令牌
EMAIL_HASH - 搜索到的电子邮件地址的CRC32和MD5哈希的组合,格式为crc32_md5
MY_ID - 访问令牌所有者的facebook个人资料的身份
但是当我使用不同的访问令牌(为我自己的应用程序生成)运行此查询时,服务器响应是:“您请求的表不存在”我还没有在Facebook API文档中找到表格电子邮件。微软在Facebook上有一些额外的权利吗?
答案 5 :(得分:0)
警告:旧的和过时的答案。不要使用
我认为您必须找到最后一个解决方案,抓取搜索的结果页面,因为您只能通过电子邮件将API搜索到已经授权您的APP的用户(并且您将需要一个,因为FB在示例中提供的令牌有一个到期日期,您需要扩展权限才能访问用户的电子邮件。)
我没有尝试的唯一方法,但我认为它以同样的方式受限,是FQL。像
这样的东西SELECT * FROM user WHERE email 'your@email.com'
答案 6 :(得分:0)
安德烈亚斯, 我一直在寻找一个“电子邮件到id”的优雅解决方案,但找不到一个。 但是,正如你所说,在这种情况下,屏幕抓取并不是一个坏主意,因为电子邮件是唯一的,你要么得到一个匹配,要么没有。只要Facebook不彻底改变他们的搜索页面,下面就可以做到这一点:
final static String USER_SEARCH_QUERY = "http://www.facebook.com/search.php?init=s:email&q=%s&type=users";
final static String USER_URL_PREFIX = "http://www.facebook.com/profile.php?id=";
public static String emailToID(String email)
{
try
{
String html = getHTML(String.format(USER_SEARCH_QUERY, email));
if (html != null)
{
int i = html.indexOf(USER_URL_PREFIX) + USER_URL_PREFIX.length();
if (i > 0)
{
StringBuilder sb = new StringBuilder();
char c;
while (Character.isDigit(c = html.charAt(i++)))
sb.append(c);
if (sb.length() > 0)
return sb.toString();
}
}
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private static String getHTML(String htmlUrl) throws MalformedURLException, IOException
{
StringBuilder response = new StringBuilder();
URL url = new URL(htmlUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setRequestMethod("GET");
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
{
BufferedReader input = new BufferedReader(new InputStreamReader(httpConn.getInputStream()), 8192);
String strLine = null;
while ((strLine = input.readLine()) != null)
response.append(strLine);
input.close();
}
return (response.length() == 0) ? null : response.toString();
}
答案 7 :(得分:0)
Facebook有一项严格的政策,即只共享个人资料向最终用户公开的内容。如果用户实际上已将电子邮件ID保持公开,那么您仍然可以获得所需内容。 您可以做的一个疯狂的尝试是将最大可能批量大小的批量请求发送到ID ...“http://graph.facebook.com/ ..并解析结果以检查电子邮件是否存在以及是否存在然后匹配到你想要的那个..你不需要任何access_token来获取公共信息..
如果您想要FB用户的电子邮件ID,唯一可能的方法是他们授权您的应用,然后您可以使用由此生成的access_token来完成所需的任务。
答案 8 :(得分:0)
也许事情发生了变化,但我记得rapleaf有一项服务,你输入一个电子邮件地址,你就可以收到一个facebook id。
https://www.rapleaf.com/
如果那里没有东西,可以用电子邮件“注册”,它应该有机会在一段时间后得到数据。
几年前,当我使用名为Maltego的搜索工具时,我发现了这一点 该应用程序使用了许多类型的“转换”,还有一些与facebook和twitter等相关的内容。
..或者在fb和fb应用程序上找到一些新的sqli,呵呵。 :)
答案 9 :(得分:0)
这显得非常简单,因为Facebook不会隐藏用户的电子邮件或电话。所以这里是带有cURL的PHP上的html解析函数
/*
Search Facebook without authorization
Query
user name, e-mail, phone, page etc
Types of search
all, people, pages, places, groups, apps, events
Result
Array with facebook page names ( facebook.com/{page} )
By 57ar7up
Date 2016
*/
function facebook_search($query, $type = 'all'){
$url = 'http://www.facebook.com/search/'.$type.'/?q='.$query;
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36';
$c = curl_init();
curl_setopt_array($c, array(
CURLOPT_URL => $url,
CURLOPT_USERAGENT => $user_agent,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_SSL_VERIFYPEER => FALSE
));
$data = curl_exec($c);
preg_match_all('/href=\"https:\/\/www.facebook.com\/(([^\"\/]+)|people\/([^\"]+\/\d+))[\/]?\"/', $data, $matches);
if($matches[3][0] != FALSE){ // facebook.com/people/name/id
$pages = array_map(function($el){
return explode('/', $el)[0];
}, $matches[3]);
} else // facebook.com/name
$pages = $matches[2];
return array_filter(array_unique($pages)); // Removing duplicates and empty values
}
答案 10 :(得分:0)
首先,我感谢你。 #57ar7up,我将添加以下代码,它有助于查找返回的电话号码。
function index(){
// $keyword = "0946664869";
$sql = "SELECT * FROM phone_find LIMIT 10";
$result = $this->GlobalMD->query_global($sql);
$fb = array();
foreach($result as $value){
$keyword = $value['phone'];
$fb[] = $this->facebook_search($keyword);
}
var_dump($fb);
}
function facebook_search($query, $type = 'all'){
$url = 'http://www.facebook.com/search/'.$type.'/?q='.$query;
$user_agent = $this->loaduserAgent();
$c = curl_init();
curl_setopt_array($c, array(
CURLOPT_URL => $url,
CURLOPT_USERAGENT => $user_agent,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_SSL_VERIFYPEER => FALSE
));
$data = curl_exec($c);
preg_match('/\{"id":(?P<fbUserId>\d+)\,/', $data, $matches);
if(isset($matches["fbUserId"]) && $matches["fbUserId"] != ""){
$fbUserId = $matches["fbUserId"];
$params = array($query,$fbUserId);
}else{
$fbUserId = "";
$params = array($query,$fbUserId);
}
return $params;
}