Âòîðíèê, 23 Äåêàáðÿ 2008 ã. 16:33
+ â öèòàòíèê
Êàê âû çíàåòå, ÿ òðàíñëèðóþ ñâîè çàïèñè â íåñêîëüêî ïîïóëÿðíûõ áëîãîìåñò â èíòåðíåòå (çà èñêëþ÷åíèåì ÆÆ). È ýòî ÿ äåëàþ íå ñ ïîìîùüþ âñòðîåííûõ ñðåäñòâ êîïèðîâàíèÿ ïîñòîâ, à ñ
ïîìîùüþ ñàìîïèñíîãî ìîäóëÿ (Extension) äëÿ äâèæêà BlogEngine.Net, ðàáîòàþùåì ïîä ASP.NET. Ïî÷åìó òàê? Äà ïîòîìó, ÷òî ÷àñòî ïðè çàäàíèè êîïèðîâàíèÿ ïîñòîâ ñ ïîìîùüþ ñòîðîííèõ ñðåäñòâ, òàêèõ êàê òðàíñëÿöèè íà Ya.ru, ïîñòû ïîìåùàåìûå â áëîã âûïàäàþò èç ïîèñêîâîãî èíäåêñà è ññûëêè â íèõ íå ó÷èòûâàþòñÿ.
1) Ìîäóëü ïîëó÷èëñÿ ðàñøèðÿåìûé, ÷òî ïîçâîëÿåò äîïèñàòü êîïèðîâàíèå ïîñòîâ êóäà âàì òîëüêî çàõî÷åòñÿ.  âûøåóêàçàííûé àðõèâ ÿ âëîæèë òîëüêî äâà êëàññà, êîòîðûå ïîçâîëÿþò êîïèðîâàòü ïîñòû íà Õàáð è íà ßðóøå÷êó. Òàê êàê ÿðóøå÷êà èìååò õåðîâûé èíòåðôåéñ, è êîä âûãëÿäèò î÷åíü ñëîæíûì (è, êñòàòè, íå ðàáîâàåò, åñëè Âû íåäàâíî çàõîäèëè ïîä ñâîèì æå àêêàóíòîì ñ äðóãîé ìàøèíû), à òàêæå ïðèäåòñÿ äîáàâèòü ñëåäóþùèå ñòðî÷êè â web.config:
- <system.net>
- <settings>
- <httpWebRequest useUnsafeHeaderParsing="true" />
- <servicePointManager expect100Continue="false"/>
- </settings>
- </system.net>
2) Äàëåå, â íàñòðîéêàõ èíòåðôåéñà ó Âàñ ïîÿâèòñÿ òàêàÿ âîò êàðòèíêà, ïîçâîëÿþùàÿ íàñòðîèòü êîïèðîâàíèå ïîñòîâ:

Îòìå÷ó, ÷òî âñå ñåëåêòèâíûå çíà÷åíèÿ ïðîïèñûâàþòñÿ âðó÷íóþ, òàê êàê â òåêóùåé âåðñèè BlogEngine íåò âîçìîæíîñòåé çàäàâàòü ïàðàìåòð ãðóïïû íàñòðîåê ìîäóëÿ â âèäå âûáîðà èç ñïèñêà. Íàäåþñü ýòî ñäåëàþò â ñëåäóþùåé âåðñèè, êîòîðóþ îáåùàþò â êîíöå ßíâàðÿ. Èòàê, ïåðâûé ïàðàìåòð îòâå÷àåò çà êîïèðîâàíèå ïîñòîâ (bool=true/false). Âòîðîé çà íàçâàíèå êàòåãîðèè, òîëüêî èç êîòîðîé , åñëè îíà óêàçàíà, áóäóò êîïèðîâàòüñÿ ïîñòû. Òðåòèé - BlogType - íàçâàíèå êëàññà îòâå÷àþùåãî çà êîïèðîâàíèå. Äàëåå ëîãèí-ïàðîëü â óäàëåííîé ñèñòåìå. BlogParam - ýòî äîïîëíèòåëüíûé ïàðàìåòð, êîòîðûé ìîæåò ïîíàäîáèòüñÿ äëÿ îïðåäåëåííûé ñèñòåì.  ÷àñòíîñòè äëÿ ßíäåêñà ÿ ïåðåäàþ íîìåð ìîåãî áëîãà, ÷òîáû íå èçâëåêàòü åãî êàæäûé ðàç. MaxAttempts(int) - êîëè÷åñòâî ïîïûòîê êïèðîâàíèÿ ïîñòà, åñëè íåóñïåõ, òî áðîñàåì ýòî äåëî. Ïîñëåäíèé - PostType(Public/Private/OnlyFriends) - òèï çàïèñè. Êàê âèäèì, äëÿ õàáðà ñòîèò Private, ÷òî îçíà÷àåò, ÷òî ÿ ïëàíèðóþ ïîäðåäàêòèðîâàòü çàïèñü è âñòàâèòü â íåå êàò, ïðåæäå ÷åì äåëàòü îáùåäîñòóïíîé õàáðà÷àíöàì.
3) Èç âíóòðåííîñòåé ðàáîòû ìîäóëÿ ðàññìîòðþ êëàññ MultiPost:
- namespace MultiPost
- {
- /// <summary>
- /// Copy all your posts to blog at http://wow.ya.ru
- /// You have to assign an login and password inside constructor
- /// </summary>
- /// <remarks>
- /// Based on pure code - http://ya.topbot.ru
- /// </remarks>
- [Extension("Copy all your posts to blogs", "0.1.1", "http://ya.topbot.ru")]
- public class MultiPost
- {
- /// <summary>
- /// Name of Module
- /// </summary>
- private static String sExtensionName = "MultiPost";
-
- static protected ExtensionSettings _settings = null;
- /*....*/
- }
- }
Êàê âèäèì ê àòðèáóòàõ êëàññà çàäàþòñÿ íàñòðîéêè ìîäóëÿ, ÷òîáû BlogEngine åãî âîñïðèíÿë êàê ðàñøèðåíèå.
Êîíñòðóêòîð äîñòàòî÷íî ïðîñòîé, ïîäïèñûâàåìñÿ íà ñîáûòèå î ðàçìåùåíèè íîâîãî ïîñòà:
- static MultiPost()
- {
- // create settings object. You need to pass exactly your
- // extension class name (case sencitive)
- ExtensionSettings settings = new ExtensionSettings(sExtensionName);
- /*.......*/
- ExtensionManager.ImportSettings(settings);
- _settings = ExtensionManager.GetSettings(sExtensionName);
- Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved);
- }
È êîäà ïðîèñõîäèò íîâûé ïîñò, òî îáðàáàòûâàåì åãî ñîçäàâàÿ íîâûé ïîòîê äëÿ ýòèõ öåëåé
- /// <summary>
- /// Occurs on new post
- /// <remarks>
- /// It opens a new thread and executes
- /// because it takes some time to complete.
- /// </remarks>
- /// </summary>
- private static void Post_Saved(object sender, SavedEventArgs e)
- {
- if (e.Action != SaveAction.Insert)
- return;
-
- IPublishable item = (IPublishable)sender;
-
- //(HttpContext.Current == null || !HttpContext.Current.Request.IsLocal)
- if (item.IsVisible)
- {
- //getting new thread to do all crap
- ThreadPool.QueueUserWorkItem(delegate {
- PostCycle(item);
- });
- }
- }
-
- /// <summary>
- /// Main process to post
- /// </summary>
- /// <param name="item"></param>
- public static void PostCycle(IPublishable item){
- //ïåðå÷èñëÿåì âñå áëîãè, ÷òî àêòèâíû...
- DataTable dt = _settings.GetDataTable();
- //pure code, coz i cant change Categories class
- string catsline = "";
- foreach (Category c in item.Categories)
- {
- catsline += c.Title + ",";
- }
- for (int i = dt.Rows.Count - 1; i >= 0; i--)
- {
- SettingsCollection sets = new SettingsCollection(dt.Rows[i].ItemArray);
- if (!sets.Enabled ||
- (!String.IsNullOrEmpty(sets.CopyOnTags.Trim())
- && catsline.Contains(sets.CopyOnTags))
- )
- {//not allowed to post
- dt.Rows.RemoveAt(i);
- }
- }
- //lets finish the others
- for (int i = dt.Rows.Count - 1; dt.Rows.Count > 0; i--)
- {
- Thread.Sleep(5000);
- if (i < 0)//new cycle...bad...bad
- {
- i = dt.Rows.Count;
- }
- try
- {
- SettingsCollection sets = new SettingsCollection(dt.Rows[i].ItemArray);
- Type tBlog = Type.GetType("MultiPost.Blogs."+sets.BlogType);
- Object theBlog = Activator.CreateInstance(tBlog,
- new object[1] { sets });
- Type[] paramTypes = {
- typeof(IPublishable)
- };
- Object[] ps = new object[1] { item };
- MethodInfo mDefaults = tBlog.GetMethod("ProcessItem", paramTypes);
- if ((Boolean)mDefaults.Invoke(theBlog, ps))//if success
- {
- dt.Rows.RemoveAt(i);
- }
- //failed, lets continue
- }
- catch(Exception e)//toomanyattempts
- {
- dt.Rows.RemoveAt(i);
- }
-
- }
- }
 îñíîâíîì öèêëå, ìû ñîçäàåì îáúåêò êëàññà, è âûçûâàåì íóæíóþ ôóíêöèþ ðàçìåùåíèÿ ïîñòà, ïåðåäàâàÿ åé íàñòðîéêè. Êàê âèäíî ïîïûòêà ðàçìåñòèòü ïîñò ïðîèñõîäèò êàæäûå 5 ñåêóíä. Îáðàáîòêà îáúåêòîâ èäåò íà îáúåêòå Rows, ÷òî íåêðàñèâî, íî ïðîñòî. Îñòàëüíîå Âû ìîæåòå íàéòè âíóòðè âûëîæåííîãî àðõèâà.
PS: ×òîáû èìåòü âîçìîæíîñòü ïðàâèòü íàñòðîéêè ðåêîìåíäóþ çàìåíèòü êîìïîíåíò admin/Extension Manager/Settings.ascx.cs íà ôàéë, âëîæåííûé àðõèâ. Òàì èñïðàâëåíà íåêîòîðàÿ îøèáêà â ôóíêöèè ðåäàêòèðîâàíèÿ íàñòðîåê.
http://flashr.ya.ru/replies.xml?item_no=1251
Ìåòêè:
ya.ru:text
-
Çàïèñü ïîíðàâèëàñü
-
0
Ïðîöèòèðîâàëè
-
0
Ñîõðàíèëè
-