summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Pösel <robyer@seznam.cz>2016-01-02 06:40:30 +0000
committerRobert Pösel <robyer@seznam.cz>2016-01-02 06:40:30 +0000
commitbc23edb7878995498fa89e37438cdbc77e2b93bf (patch)
tree433ce5e39febead4d4114e77402f7e5d7eefdd52
parent961bf5e6b1ba406951a7624962973bacfe140cd5 (diff)
Facebook: Fix broken login for some people (WARNING: loading frienship requests at login and searching users will not work for them); version bump
Some people may have not available page mbasic.facebook.com, but only m.facebook.com works for them. Problem is that "m." version shows internally either "mbasic." version OR "touch." version. In latter case source code of page looks completely different and is hard to parse. This commit uses "m." version for home (get own name, avatar and logout hash) and dtsg (get dtsg token) requests and allows parsing from both "touch." and "mbasic." versions. Problem is with loading friendship requets at login and searching users, because plugin can't parse such data for "touch." and uses only "mbasic." - so if user can't load "mbasic.", these features won't work. git-svn-id: http://svn.miranda-ng.org/main/trunk@15981 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r--protocols/FacebookRM/src/communication.cpp33
-rw-r--r--protocols/FacebookRM/src/constants.h3
-rw-r--r--protocols/FacebookRM/src/process.cpp2
-rw-r--r--protocols/FacebookRM/src/version.h2
4 files changed, 30 insertions, 10 deletions
diff --git a/protocols/FacebookRM/src/communication.cpp b/protocols/FacebookRM/src/communication.cpp
index ca68731d33..bc8f8a11e5 100644
--- a/protocols/FacebookRM/src/communication.cpp
+++ b/protocols/FacebookRM/src/communication.cpp
@@ -74,7 +74,7 @@ http::response facebook_client::flap(RequestType request_type, std::string *post
// Set flags
nlhr.flags = NLHRF_HTTP11 | NLHRF_SSL;
- if (server == FACEBOOK_SERVER_MOBILE) {
+ if (server == FACEBOOK_SERVER_MBASIC || server == FACEBOOK_SERVER_MOBILE) {
nlhr.flags |= NLHRF_REDIRECT;
}
@@ -241,10 +241,12 @@ std::string facebook_client::choose_server(RequestType request_type)
case REQUEST_HOME:
case REQUEST_DTSG:
+ return FACEBOOK_SERVER_MOBILE;
+
case REQUEST_LOAD_FRIENDSHIPS:
case REQUEST_SEARCH:
case REQUEST_USER_INFO_MOBILE:
- return FACEBOOK_SERVER_MOBILE;
+ return FACEBOOK_SERVER_MBASIC;
// case REQUEST_LOGOUT:
// case REQUEST_BUDDY_LIST:
@@ -987,8 +989,16 @@ bool facebook_client::home()
{
case HTTP_CODE_OK:
{
- // Get real name
- this->self_.real_name = utils::text::source_get_value(&resp.data, 4, "id=\"root", "<strong", ">", "</strong>");
+ std::string touchSearch = "{\"id\":" + this->self_.user_id;
+ std::string touchData = utils::text::source_get_value(&resp.data, 2, touchSearch.c_str(), "}");
+
+ // Get real name (from touch version)
+ if (!touchData.empty())
+ this->self_.real_name = utils::text::html_entities_decode(utils::text::slashu_to_utf8(utils::text::source_get_value(&touchData, 2, "\"name\":\"", "\"")));
+
+ // Another attempt to get real name (from mbasic version)
+ if (this->self_.real_name.empty())
+ this->self_.real_name = utils::text::source_get_value(&resp.data, 4, "id=\"root", "<strong", ">", "</strong>");
// Try to get name again, if we've got some some weird version of Facebook
if (this->self_.real_name.empty())
@@ -1006,13 +1016,22 @@ bool facebook_client::home()
this->self_.real_name = this->self_.real_name.substr(0, pos - 1);
}
+
+ // Another attempt to get optional nickname
+ if (this->self_.nick.empty())
+ this->self_.nick = utils::text::html_entities_decode(utils::text::slashu_to_utf8(utils::text::source_get_value(&resp.data, 3, "class=\\\"alternate_name\\\"", ">(", ")\\u003C\\/")));
this->self_.real_name = utils::text::remove_html(this->self_.real_name);
- parent->debugLogA(" Got self real name: %s", this->self_.real_name.c_str());
+ parent->debugLogA(" Got self real name (nickname): %s (%s)", this->self_.real_name.c_str(), this->self_.nick.c_str());
parent->SaveName(NULL, &this->self_);
- // Get avatar
- this->self_.image_url = utils::text::source_get_value(&resp.data, 3, "id=\"root", "<img src=\"", "\"");
+ // Get avatar (from touch version)
+ if (!touchData.empty())
+ this->self_.image_url = utils::text::html_entities_decode(utils::text::slashu_to_utf8(utils::text::source_get_value(&touchData, 2, "\"pic\":\"", "\"")));
+
+ // Another attempt to get avatar(from mbasic version)
+ if (this->self_.image_url.empty())
+ this->self_.image_url = utils::text::source_get_value(&resp.data, 3, "id=\"root", "<img src=\"", "\"");
// Another attempt to get avatar
if (this->self_.image_url.empty()) {
diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h
index 8e5fd73fbf..041b47d570 100644
--- a/protocols/FacebookRM/src/constants.h
+++ b/protocols/FacebookRM/src/constants.h
@@ -36,7 +36,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Connection
#define FACEBOOK_SERVER_REGULAR "www.facebook.com"
-#define FACEBOOK_SERVER_MOBILE "mbasic.facebook.com"
+#define FACEBOOK_SERVER_MBASIC "mbasic.facebook.com"
+#define FACEBOOK_SERVER_MOBILE "m.facebook.com"
#define FACEBOOK_SERVER_CHAT "%s-%s.facebook.com"
#define FACEBOOK_SERVER_LOGIN "www.facebook.com"
#define FACEBOOK_SERVER_APPS "apps.facebook.com"
diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp
index 8a3a88effa..6ec0683538 100644
--- a/protocols/FacebookRM/src/process.cpp
+++ b/protocols/FacebookRM/src/process.cpp
@@ -1391,7 +1391,7 @@ void FacebookProto::SearchIdAckThread(void *targ)
http::response resp = facy.flap(REQUEST_USER_INFO_MOBILE, NULL, &search);
if (resp.code == HTTP_CODE_FOUND && resp.headers.find("Location") != resp.headers.end()) {
- search = utils::text::source_get_value(&resp.headers["Location"], 2, FACEBOOK_SERVER_MOBILE"/", "_rdr", true);
+ search = utils::text::source_get_value(&resp.headers["Location"], 2, FACEBOOK_SERVER_MBASIC"/", "_rdr", true);
resp = facy.flap(REQUEST_USER_INFO_MOBILE, NULL, &search);
}
diff --git a/protocols/FacebookRM/src/version.h b/protocols/FacebookRM/src/version.h
index eb5dbab1f6..6455eefc56 100644
--- a/protocols/FacebookRM/src/version.h
+++ b/protocols/FacebookRM/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 2
#define __RELEASE_NUM 11
-#define __BUILD_NUM 6
+#define __BUILD_NUM 7
#include <stdver.h>