FC2ブログ

    Python

    メーリングリストサービスfreemlのメールをクローリングで保存する

    メーリングリストサービスfreemlが2019年12月でサービスを終了する。

    https://www.freeml.com/ep.umzx/grid/Guide/node/GuideFront/g/FreemlEnd/
    【重要なお知らせ】freeml byGMOのサービス終了につきまして


    一応メールのバックアップを取っておこうと思ったのだが、上記サイトに「・管理者の方にメール一覧のダウンロード機能を提供」と書かれていて、まさかーと思いつつ、freemlのサイトでいろいろ探したのだが、やはり、通常参加者には機能が提供されておらず、一覧をダウンロードできない様子。

    一般参加者にもメールのバックアップを取る権利はあるのでは無いかと思う、というより、手動であれば全件閲覧可能なデータに対して、その一括ダウンロード機能を管理者にしか与えない意味がわからない。

    仕方がないので、Pythonでクローリングした。
    最後のメールの番号は自動取得も可能だが、自分用なので動けばいいや仕様。

    とりあえず、ぐるぐるして、3500件くらいのメール全件取得できたので、満足した。

    ご利用の際は自己責任でお願いします。
    そろそろPEP8読みたい。

    MBOX形式を勉強しようかと思ったのだが、From情報のドメイン側が消されているので、そこまでこだわらなくて良いかなと思った。

    スポンサーサイト



    Pythonでシーザー暗号実装

    この間時間制限ありのPython問題集でシーザー暗号のプログラムを組むことがあったのですが、時間制限があるとだめだね。

    緊張して全然頭まわらない。

    プログラムの仕様としては
    • 文字列(変数名Message str型)
    • ずらす個数(変数名Key int型)
    • 暗号化した文字列(Result str型)
    • 暗号化する文字はa-zA-Zのみで,や:などの文字はそのまま表示する

    とりあえず、「文字をずらす!」ということをするので、ordで文字コードを取得して、a-zA-Zの間にあればKey分ずらすというものを書いたのだが、とても分かりづらいものになってしまった。

    後から考えてみると、
    小文字アルファベット、大文字アルファベットの文字列を用意しておき、その中から検索して、見つかればずらすとしたほうがスマートだったなと思ったので書いてみた。

    問題集では暗号化のみを扱っていたが、ついでなので複合もできるように拡張しておいた。

    import re
    
    def cryption_caesar(Message, Key, IsEncrypt):
        assert isinstance(Message, str), "Error"
        assert isinstance(Key, int), "Error"
        assert Key > -1, "Error"
        assert isinstance(IsEncrypt, bool), "Error"
        
        alf_s = "abcdefghijklmnopqrstuvwxyz"
        alf_l = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        
        result = ""
        
        if Key > 26:
            Key = Key % 26
        
        for e in Message:
            if re.search(r"[a-z]", e):
                if IsEncrypt:
                    if alf_s.find(e) + Key > 25:
                        result += alf_s[alf_s.find(e) + Key - 26]
                    else:
                        result += alf_s[alf_s.find(e) + Key]
                else:
                    if alf_s.find(e) - Key < 0:
                        result += alf_s[alf_s.find(e) - Key + 26]
                    else:
                        result += alf_s[alf_s.find(e) - Key]
            elif re.search(r"[A-Z]", e):
                if IsEncrypt:
                    if alf_l.find(e) + Key > 25:
                        result += alf_l[alf_l.find(e) + Key - 26]
                    else:
                        result += alf_l[alf_l.find(e) + Key]
                else:
                    if alf_l.find(e) - Key < 0:
                        result += alf_l[alf_l.find(e) - Key + 26]
                    else:
                        result += alf_l[alf_l.find(e) - Key]
            else:
                result += e
        
        return result
    

    cryption_caesarの3つ目の変数がTrueなら暗号化、Falseなら復号する。

    入力文字列 rin_jugatlaを暗号化すると
    sjo_kvhbumbとなる、これを復号すると
    rin_jugatlaに戻ると。

    あぁ、なぜ最初にこの方法を思いつかなかったんだろう・・・。
    assertのエラー文が雑とか、条件分岐も雑とかいろいろあるけど、まぁ動けばいいかな。