-1

Web サイトを介した SMS メッセージの送信を自動化するスクリプトに取り組んでいます。これを行うためにMechanizeBeautifulSoup 4を使用しています。

このプログラムは、コマンド ラインから呼び出し、番号とメッセージを引数として渡すことによって機能します。このために私はOptparseを使用しています。

メッセージはコマンド ライン経由でプログラムに渡されますが、Web サイトでは SMS メッセージごとに 444 文字しか受け付けません。だから私は次のことをしようとしています:

  • メッセージ文字列の長さ (空白を含む) と IF が 444 より大きい場合...
  • 一時メッセージ文字列を受け取り、一時メッセージ文字列の長さが 444 を超えなくなるまで、インデックス 0 から全メッセージ文字列の最初の 444 文字をリスト オブジェクトに追加する while ループを繰り返します。
  • 次に、リスト オブジェクト内のアイテムの数を使用して、For ループ ブロックを反復処理します。このブロックは、各反復が 444 文字の文字列のインデックス (メッセージ全体の分割) に対応するメッセージの送信処理をループします。その 444 文字のメッセージ スライスを適切な HTML フォーム フィールドに配置し、Mechanize を送信するメッセージとして使用します (理解できることを願っています)。

これまでに書いたコードは次のとおりです。

message = "abcdefghijklmnopqrstuvwxyz..." # imagine it is > 444 characters
messageList = []
if len(message) > 444:
    tmpMsgString = message
    counter = 0
    msgLength = len(message)

    while msgLength > 444:
        messageList.append(tmpMsgString[counter:counter+445]) # 2nd index needs to point to last character's position in the string, not "counter+445" because this would cause an error when there isn't enough characters in string?
        tmpMsgString = tmpMsgString[counter+445:msgLength])
        msgLength = msgLength-444
        counter = counter + 444
else:
    messageList.append(message)

コマンド ラインから引数を受け取るコードの部分を管理できます。また、for ループ ブロックをループして、リスト内の各項目を送信するメッセージとして使用することもできますが、Python の経験はほとんどなく、コードのこの部分で私を助けるために、経験豊富な目が必要です! すべての助けに感謝します。

4

2 に答える 2

4

電池が含まれています。これは、デモンストレーションのために 44 文字を使用します。結果のリストは簡単に反復できます。さらに、任意ではなく、単語の境界で分割されます。

>>> import textwrap
>>> s = "lorem ipsum" * 20
>>> textwrap.wrap(s, width=44)
['lorem ipsumlorem ipsumlorem ipsumlorem', 'ipsumlorem ipsumlorem ipsumlorem ipsumlorem', 'ipsumlorem ipsumlorem ipsumlorem ipsumlor
em', 'ipsumlorem ipsumlorem ipsumlorem ipsumlorem', 'ipsumlorem ipsumlorem ipsumlorem ipsumlorem', 'ipsum']
于 2013-09-25T20:01:47.813 に答える
2

文字列を 444 文字のチャンクに分割するだけであれば、カウンターや複雑なものは必要ありません。現在のコードを更新する方法は次のとおりです。

message = "whatever..."*1000
tmp = message
msgList = []
while tmp:
    msgList.append(tmp[:444])
    tmp = tmp[444:]

これは、シーケンスの範囲外にまたがるスライスがシーケンスの最後まで切り捨てられるため機能します ( IndexErrors は発生しません)。スライス全体が範囲外の場合、結果は空になります。

リスト内包表記を使用すると、これをもう少しうまく実行できる場合があります。

message = "whatever"*1000
msgList = [message[i:i+444] for i in range(0, len(message), 444)]
于 2013-09-25T20:01:58.920 に答える