-Ìóçûêà

 -Ïîäïèñêà ïî e-mail

 

 -Ïîèñê ïî äíåâíèêó

Ïîèñê ñîîáùåíèé â Flashr

 -Ñòàòèñòèêà

Ñòàòèñòèêà LiveInternet.ru: ïîêàçàíî êîëè÷åñòâî õèòîâ è ïîñåòèòåëåé
Ñîçäàí: 26.02.2007
Çàïèñåé:
Êîììåíòàðèåâ:
Íàïèñàíî: 6574


BlogEngine - MultiPost

Âòîðíèê, 23 Äåêàáðÿ 2008 ã. 16:33 + â öèòàòíèê

Êàê âû çíàåòå, ÿ òðàíñëèðóþ ñâîè çàïèñè â íåñêîëüêî ïîïóëÿðíûõ áëîãîìåñò â èíòåðíåòå (çà èñêëþ÷åíèåì ÆÆ). È ýòî ÿ äåëàþ íå ñ ïîìîùüþ âñòðîåííûõ ñðåäñòâ êîïèðîâàíèÿ ïîñòîâ, à ñ ïîìîùüþ ñàìîïèñíîãî ìîäóëÿ (Extension) äëÿ äâèæêà BlogEngine.Net, ðàáîòàþùåì ïîä ASP.NET. Ïî÷åìó òàê? Äà ïîòîìó, ÷òî ÷àñòî ïðè çàäàíèè êîïèðîâàíèÿ ïîñòîâ ñ ïîìîùüþ ñòîðîííèõ ñðåäñòâ, òàêèõ êàê òðàíñëÿöèè íà Ya.ru, ïîñòû ïîìåùàåìûå â áëîã âûïàäàþò èç ïîèñêîâîãî èíäåêñà è ññûëêè â íèõ íå ó÷èòûâàþòñÿ.


1) Ìîäóëü ïîëó÷èëñÿ ðàñøèðÿåìûé, ÷òî ïîçâîëÿåò äîïèñàòü êîïèðîâàíèå ïîñòîâ êóäà âàì òîëüêî çàõî÷åòñÿ.  âûøåóêàçàííûé àðõèâ ÿ âëîæèë òîëüêî äâà êëàññà, êîòîðûå ïîçâîëÿþò êîïèðîâàòü ïîñòû íà Õàáð è íà ßðóøå÷êó. Òàê êàê ÿðóøå÷êà èìååò õåðîâûé èíòåðôåéñ, è êîä âûãëÿäèò î÷åíü ñëîæíûì (è, êñòàòè, íå ðàáîâàåò, åñëè Âû íåäàâíî çàõîäèëè ïîä ñâîèì æå àêêàóíòîì ñ äðóãîé ìàøèíû), à òàêæå ïðèäåòñÿ äîáàâèòü ñëåäóþùèå ñòðî÷êè â web.config:
  1. <system.net>

  2.    <settings>

  3.      <httpWebRequest useUnsafeHeaderParsing="true" />

  4.      <servicePointManager expect100Continue="false"/>

  5.    </settings>

  6.  </system.net>





2) Äàëåå, â íàñòðîéêàõ èíòåðôåéñà ó Âàñ ïîÿâèòñÿ òàêàÿ âîò êàðòèíêà, ïîçâîëÿþùàÿ íàñòðîèòü êîïèðîâàíèå ïîñòîâ:


Îòìå÷ó, ÷òî âñå ñåëåêòèâíûå çíà÷åíèÿ ïðîïèñûâàþòñÿ âðó÷íóþ, òàê êàê â òåêóùåé âåðñèè BlogEngine íåò âîçìîæíîñòåé çàäàâàòü ïàðàìåòð ãðóïïû íàñòðîåê ìîäóëÿ â âèäå âûáîðà èç ñïèñêà. Íàäåþñü ýòî ñäåëàþò â ñëåäóþùåé âåðñèè, êîòîðóþ îáåùàþò â êîíöå ßíâàðÿ. Èòàê, ïåðâûé ïàðàìåòð îòâå÷àåò çà êîïèðîâàíèå ïîñòîâ (bool=true/false). Âòîðîé çà íàçâàíèå êàòåãîðèè, òîëüêî èç êîòîðîé , åñëè îíà óêàçàíà, áóäóò êîïèðîâàòüñÿ ïîñòû. Òðåòèé - BlogType - íàçâàíèå êëàññà îòâå÷àþùåãî çà êîïèðîâàíèå. Äàëåå ëîãèí-ïàðîëü â óäàëåííîé ñèñòåìå. BlogParam - ýòî äîïîëíèòåëüíûé ïàðàìåòð, êîòîðûé ìîæåò ïîíàäîáèòüñÿ äëÿ îïðåäåëåííûé ñèñòåì.  ÷àñòíîñòè äëÿ ßíäåêñà ÿ ïåðåäàþ íîìåð ìîåãî áëîãà, ÷òîáû íå èçâëåêàòü åãî êàæäûé ðàç. MaxAttempts(int) - êîëè÷åñòâî ïîïûòîê êïèðîâàíèÿ ïîñòà, åñëè íåóñïåõ, òî áðîñàåì ýòî äåëî. Ïîñëåäíèé - PostType(Public/Private/OnlyFriends) - òèï çàïèñè. Êàê âèäèì, äëÿ õàáðà ñòîèò Private, ÷òî îçíà÷àåò, ÷òî ÿ ïëàíèðóþ ïîäðåäàêòèðîâàòü çàïèñü è âñòàâèòü â íåå êàò, ïðåæäå ÷åì äåëàòü îáùåäîñòóïíîé õàáðà÷àíöàì.


3) Èç âíóòðåííîñòåé ðàáîòû ìîäóëÿ ðàññìîòðþ êëàññ MultiPost:
  1. namespace MultiPost

  2. {

  3.     /// <summary>

  4.     /// Copy all your posts to blog at http://wow.ya.ru

  5.     /// You have to assign an login and password inside constructor

  6.     /// </summary>

  7.     /// <remarks>

  8.     /// Based on pure code - http://ya.topbot.ru

  9.     /// </remarks>

  10.     [Extension("Copy all your posts to blogs", "0.1.1", "http://ya.topbot.ru")]

  11.     public class MultiPost

  12.     {

  13.         /// <summary>

  14.         /// Name of Module

  15.         /// </summary>

  16.         private static String sExtensionName = "MultiPost";

  17.  

  18.         static protected ExtensionSettings _settings = null;

  19.         /*....*/

  20.     }

  21. }


Êàê âèäèì ê àòðèáóòàõ êëàññà çàäàþòñÿ íàñòðîéêè ìîäóëÿ, ÷òîáû BlogEngine åãî âîñïðèíÿë êàê ðàñøèðåíèå.
Êîíñòðóêòîð äîñòàòî÷íî ïðîñòîé, ïîäïèñûâàåìñÿ íà ñîáûòèå î ðàçìåùåíèè íîâîãî ïîñòà:
  1. static MultiPost()

  2. {

  3.     // create settings object. You need to pass exactly your

  4.     // extension class name (case sencitive)

  5.     ExtensionSettings settings = new ExtensionSettings(sExtensionName);

  6.     /*.......*/

  7.     ExtensionManager.ImportSettings(settings);            

  8.     _settings = ExtensionManager.GetSettings(sExtensionName);

  9.     Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved);

  10. }


È êîäà ïðîèñõîäèò íîâûé ïîñò, òî îáðàáàòûâàåì åãî ñîçäàâàÿ íîâûé ïîòîê äëÿ ýòèõ öåëåé
  1. /// <summary>

  2.  /// Occurs on new post

  3.  /// <remarks>

  4.  /// It opens a new thread and executes

  5.  /// because it takes some time to complete.

  6.  /// </remarks>

  7.  /// </summary>

  8.  private static void Post_Saved(object sender, SavedEventArgs e)

  9.  {

  10.      if (e.Action != SaveAction.Insert)

  11.          return;

  12.  

  13.      IPublishable item = (IPublishable)sender;

  14.  

  15.      //(HttpContext.Current == null || !HttpContext.Current.Request.IsLocal)

  16.      if (item.IsVisible)

  17.      {

  18.          //getting new thread to do all crap

  19.           ThreadPool.QueueUserWorkItem(delegate {

  20.               PostCycle(item);

  21.           });

  22.      }

  23.  }

  24.  

  25.  /// <summary>

  26.  /// Main process to post

  27.  /// </summary>

  28.  /// <param name="item"></param>

  29.  public static void PostCycle(IPublishable item){

  30.      //ïåðå÷èñëÿåì âñå áëîãè, ÷òî àêòèâíû...

  31.      DataTable dt = _settings.GetDataTable();

  32.      //pure code, coz i cant change Categories class

  33.      string catsline = "";

  34.      foreach (Category c in item.Categories)

  35.      {

  36.          catsline += c.Title + ",";

  37.      }

  38.      for (int i = dt.Rows.Count - 1; i >= 0; i--)

  39.      {

  40.          SettingsCollection sets = new SettingsCollection(dt.Rows[i].ItemArray);

  41.          if (!sets.Enabled ||

  42.              (!String.IsNullOrEmpty(sets.CopyOnTags.Trim())

  43.              && catsline.Contains(sets.CopyOnTags))

  44.              )

  45.          {//not allowed to post

  46.              dt.Rows.RemoveAt(i);

  47.          }

  48.      }

  49.      //lets finish the others

  50.      for (int i = dt.Rows.Count - 1; dt.Rows.Count > 0; i--)

  51.      {

  52.          Thread.Sleep(5000);

  53.          if (i < 0)//new cycle...bad...bad

  54.          {

  55.              i = dt.Rows.Count;                    

  56.          }

  57.          try

  58.          {

  59.              SettingsCollection sets = new SettingsCollection(dt.Rows[i].ItemArray);

  60.              Type tBlog = Type.GetType("MultiPost.Blogs."+sets.BlogType);

  61.              Object theBlog = Activator.CreateInstance(tBlog,

  62.                  new object[1] { sets });

  63.              Type[] paramTypes = {

  64.                      typeof(IPublishable)

  65.                        };

  66.              Object[] ps = new object[1] { item };

  67.              MethodInfo mDefaults = tBlog.GetMethod("ProcessItem", paramTypes);

  68.              if ((Boolean)mDefaults.Invoke(theBlog, ps))//if success

  69.              {

  70.                  dt.Rows.RemoveAt(i);

  71.              }

  72.              //failed, lets continue

  73.          }

  74.          catch(Exception e)//toomanyattempts

  75.          {

  76.              dt.Rows.RemoveAt(i);

  77.          }

  78.  

  79.      }

  80.  }


 îñíîâíîì öèêëå, ìû ñîçäàåì îáúåêò êëàññà, è âûçûâàåì íóæíóþ ôóíêöèþ ðàçìåùåíèÿ ïîñòà, ïåðåäàâàÿ åé íàñòðîéêè. Êàê âèäíî ïîïûòêà ðàçìåñòèòü ïîñò ïðîèñõîäèò êàæäûå 5 ñåêóíä. Îáðàáîòêà îáúåêòîâ èäåò íà îáúåêòå Rows, ÷òî íåêðàñèâî, íî ïðîñòî. Îñòàëüíîå Âû ìîæåòå íàéòè âíóòðè âûëîæåííîãî àðõèâà.
PS: ×òîáû èìåòü âîçìîæíîñòü ïðàâèòü íàñòðîéêè ðåêîìåíäóþ çàìåíèòü êîìïîíåíò admin/Extension Manager/Settings.ascx.cs íà ôàéë, âëîæåííûé àðõèâ. Òàì èñïðàâëåíà íåêîòîðàÿ îøèáêà â ôóíêöèè ðåäàêòèðîâàíèÿ íàñòðîåê.






http://flashr.ya.ru/replies.xml?item_no=1251
Ìåòêè:  

 

Äîáàâèòü êîììåíòàðèé:
Òåêñò êîììåíòàðèÿ: ñìàéëèêè

Ïðîâåðêà îðôîãðàôèè: (íàéòè îøèáêè)

Ïðèêðåïèòü êàðòèíêó:

 Ïåðåâîäèòü URL â ññûëêó
 Ïîäïèñàòüñÿ íà êîììåíòàðèè
 Ïîäïèñàòü êàðòèíêó