۱۳۹۰/۰۸/۱۰

راهي از گوگل ريدر به گوگل پلاس و سپس به دنياي خارج!


از امروز قابليت‌هاي اجتماعي گوگل ريدر با گوگل پلاس يكي شده و به همين جهت يك سري از امكانات قديمي آن حذف گرديده‌اند؛ مانند به اشتراك گذاري و لايك زدن و غيره و تمام اين‌ها با دكمه‌ي به علاوه يك گوگل پلاس جايگزين شده‌اند. اينبار مي‌شود علاقمند‌ي‌ها را از گوگل ريدر به حلقه‌هاي گوگل پلاس هدايت كرد. همه‌ي اين‌ها خوب؛ اما سيستم به اشتراك گذاري‌هاي روزانه‌ي من رو به هم ريخته اين‌ كارها! قبلا از حاصل اشتراك‌ها در گوگل ريدر، يك فيد تهيه مي‌شد كه الان ديگر وجود خارجي ندارد. هيچكدام از حلقه‌هاي گوگل پلاس هم فيد ندارند. به اين ترتيب اين محصول، تبديل به يك فيدخوان معمولي شده است. مثل 100ها برنامه‌ي مشابه ديگر.

اما ... در ادامه ببينيم كه چطور مي‌توان از گوگل ريدر جديد، راهي به خارج باز كرد!

الف) زمانيكه در محيط گوگل ريدر، بر روي دكمه به علاوه يك گوگل پلاس قرار گرفته در ذيل يك مطلب كليك مي‌كنيد، مي‌توان نام حلقه‌اي از حلقه‌هاي گوگل پلاس را انتخاب كرد تا مطلب ما به آن ارسال شود. يكي از اين حلقه‌ها، Public نام دارد. بنابراين اينبار اگر قصد به اشتراك گذاري عمومي مطلبي را داشتيد مطابق شكل زير، حلقه Public را وارد نمائيد و جالب اينجا است كه اين حلقه فقط در گوگل ريدر قابل انتخاب است؛ نه در خود گوگل پلاس.


ب) اكنون به اكانت گوگل پلاس خود مراجعه كنيد. در قسمت پروفايل، به لينك بالاي صفحه دقت نمائيد. چيزي است شبيه به:

https://plus.google.com/u/0/userId/posts 

اين userId براي ادامه كار مهم است.

ج) از اين userId براي فراخواني لينك زير استفاده خواهيم كرد (userId آن بايد جايگزين شود):

https://plus.google.com/_/stream/getactivities/?&sp=[1,2,"userId",null,null,null,null,"social.google.com",[]]


خروجي آن طبق معمول متداول گوگل، فرمت JSON است و مي‌توان از آن ليست اشتراك‌هاي عمومي را استخراج كرد. براي نمونه كلاس GooglePlusJsonParser تهيه شده زير مي‌تواند اين عمليات را انجام دهد:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
//needs a ref. to System.Web.Extensions asm.
using System.Web.Script.Serialization;

namespace GooglePlus
{
    [DebuggerDisplay("{DateTime}-{Title}-{Comment}-{Url}")]
    public class GooglePlusItem
    {
        public DateTime DateTime { set; get; }
        public string Url { set; get; }
        public string Title { set; get; }
        public string Comment { set; get; }
    }

    public static class Utils
    {
        public static DateTime ConvertFromUnixTimestamp(this long data)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(data);
        }

        public static string ToSafeString(this object data)
        {
            return data == null ? string.Empty : data.ToString();
        }
    }

    public class GooglePlusJsonParser
    {
        public static IList<GooglePlusItem> GetMyPublicItemsList(string userId)
        {
            var url = string.Format("https://plus.google.com/_/stream/getactivities/?&sp=[1,2,\"{0}\",null,null,null,null,\"social.google.com\",[]]", userId);
            var jsonData = new WebClient().DownloadString(url);
            return ParsePublicData(jsonData);
        }

        public static IList<GooglePlusItem> ParsePublicData(string jsonData)
        {
            jsonData = removeRedundantData(jsonData);
            var posts = parseJson(jsonData);
            return createItemsList(posts);
        }

        private static IList<GooglePlusItem> createItemsList(object[] posts)
        {
            var result = new List<GooglePlusItem>();
            foreach (object[] post in posts)
            {
                var items = (object[])((object[])post[66])[0];
                result.Add(new GooglePlusItem
                {
                    DateTime = (((Int64)post[5]) / 1000).ConvertFromUnixTimestamp(),
                    Title = items[3].ToSafeString(),
                    Url = items[1].ToSafeString(),
                    Comment = post[4].ToSafeString()
                });
            }
            return result;
        }

        private static object[] parseJson(string jsonData)
        {
            var jsonObject = new JavaScriptSerializer().Deserialize<object[]>(jsonData);
            var posts = (object[])(((object[])jsonObject[1])[0]);
            return posts;
        }

        private static string removeRedundantData(string jsonData)
        {
            return jsonData.Replace(")]}'", string.Empty)
                           .Replace("[,", "[\"\",")
                           .Replace(",,", ",\"\",")
                           .Replace(",,", ",\"\",");
        }
    }
}

نحوه استفاده از آن هم مي‌تواند فراخواني متد GooglePlusJsonParser.GetMyPublicItemsList به همراه userId ياد شده باشد.



ايده اصلي از:
Getting the Google+ Feed for any profile in JSON