diff options
author | Robert Pösel <robyer@seznam.cz> | 2016-01-02 06:40:30 +0000 |
---|---|---|
committer | Robert Pösel <robyer@seznam.cz> | 2016-01-02 06:40:30 +0000 |
commit | bc23edb7878995498fa89e37438cdbc77e2b93bf (patch) | |
tree | 433ce5e39febead4d4114e77402f7e5d7eefdd52 | |
parent | 961bf5e6b1ba406951a7624962973bacfe140cd5 (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.cpp | 33 | ||||
-rw-r--r-- | protocols/FacebookRM/src/constants.h | 3 | ||||
-rw-r--r-- | protocols/FacebookRM/src/process.cpp | 2 | ||||
-rw-r--r-- | protocols/FacebookRM/src/version.h | 2 |
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> |