Войти

Показать полную графическую версию : [решено] скрипт для создания системы взаимопомощи на дороге


VAFER
03-11-2012, 21:55
Уважаемые гуру BAT-файлов
прошу помочь в написании скрипта для создания системы взаимопомощи на дороге для одного из автоклубов

при поступлении смс скрипт определяет номер отправителя и если этот номер есть в базе, он формирует смс сообщения для остальных участников

суть:

имеем 3 текстовых файла:

1. in_file.txt - содержит смс принятые gprs-модемом
2. out_file.txt - содержит смс, которые модем должен отправить
3. base.txt - содержит номера телефонов куда отправлять


для взаимодействия с модемом используется отдельная программа
при получении смс, в определенной папке на диске она создает текстовый файл, в который пишет данные вот в таком виде:

http://www.simplesms.ru/wp-content/uploads/desc_re2.gif

на пк постоянно крутиться скрипт на BAT/CMD файле, который:

1. раз в минуту проверяет пришло ли новое сообщение (появилась ли новая строка в файле, либо изменилось ли время изм файла)
2. считывает номер отправителя и текст сообщения в буфер
3. проверяет, есть ли такой отправитель в базе (защита от спама)
4. если отправитель есть - скрипт формирует файл для отправки смс следующего вида:

http://www.simplesms.ru/wp-content/uploads/desc2.gif

каждая строка - это отдельное смс для каждого телефона из базы

5. помещает его в папку отправки

после чего программа работы с модемом отправляет все смс и удаляет файл


сам я давным давно уже ничего подобного не писал, потому обращаюсь за помощью

заранее спасибо

Iska
04-11-2012, 01:04
на пк постоянно крутиться скрипт на BAT/CMD файле, который »
Он уже есть, или его как раз надо написать?

Зачем это «либо»:
либо изменилось ли время изм файла) »
?

проверяет, есть ли такой отправитель в базе »
«base.txt» — этот файл?

4. если отправитель есть - скрипт формирует файл для отправки смс следующего вида: »
Непонятен принцип. Что должно быть в сформированной строке?

VAFER
04-11-2012, 15:19
Он уже есть, или его как раз надо написать? »

его как раз и надо написать

Зачем это «либо»:
Цитата VAFER:
либо изменилось ли время изм файла) »
? »

не знаю, я думал таким образом отслеживать появление новых смс (записей в файле)Цитата VAFER:
проверяет, есть ли такой отправитель в базе »
«base.txt» — этот файл? »
да

формируется вот такой файл:
http://www.simplesms.ru/wp-content/uploads/desc2.gif
в каждой строке будет одно и тоже сообщение (то которое пришло)
а номера разные (из базы)

ну т.е. один из тех кто есть в базе (участник системы) отправляет на сервисный номер смс с текстом:
я такой-то, стою там-то, проблема такая-то

это смс потом отправляется все остальным участникам

программа приема и отправки есть, надо написать скрипт который будет считывать пришедшее смс из текстового файла, а затем формировать текстовый файл для отправки сообщений

Iska
04-11-2012, 16:02
Ага. Теперь примерно понятно, что требуется.

Выложите образцы (а не скриншоты) реальных файлов «sms1.txt» и «primer1.txt».

VAFER
04-11-2012, 16:29
файл in_file.txt (входящие смс, на скриншоте он называется sms1.txt):

Формат файла входящих смс:
дата-время_отправки_смс;номер_отправителя;текст_сообщения


файл out_file.txt (исходящие смс, на скриншоте он называется primer1):

Формат файла исходящих смс:
номер_отправителя;M;R;текст_сообщения


файл base.txt (база данных номеров):

Формат файла:
каждая строчка - номер телефона в формате 7хххххххххх

VAFER
05-11-2012, 19:08
Весь день изучал форум... голова кругом
в итоге набросал вот такой код (некоторые места не понял как сделать, потому написал просто что нужно)

прошу поправить/подсказать/посоветовать как лучше это реализовать



@echo off
setlocal enabledelayedexpansion

rem считываем базу телефонов из файла base.txt

set i=0
echo база телефонов
for /F "tokens=*" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
echo %%a
)

rem считываем кол-во строк в файле входящих смс и сравниваем с переменной в файле count.txt
set Lines=0
for /F "usebackq" %%L In ("in_file.txt") Do (Set /A Lines+=1)
echo !Lines! входящих смс

FOR /F "tokens=*" %%k in (count.txt) do echo count:%%k

rem если изменилось, то считываем последнюю строку из файла in_file.txt и записываем в файл count.txt новое значение числа входящих смс

IF !k!>!Lines! echo > count.txt


rem считываем файл входящих смс, берем последнюю строку (так и не понял как это сделать)


FOR /F "tokens=2,3 delims=;" %%i in (in_file.txt) do echo num:%%i text:%%j




rem проверяем есть ли телефон отправителя в базе, если есть создаем файл для исходящих смс

FOR /L %%b IN (1,1,кол-во телефонов) DO (

IF te1l==tel2 для каждого телефона из базы set telok=1

)

IF telok=1 FOR /L %%g IN (1,1,кол-во телефонов) DO (

echo %num!g!%;M;R;%%j >> out_file.txt

)

echo работа выполнена

sleep 60

Iska
05-11-2012, 22:59
VAFER, в качестве варианта — скрипт WSH на VBScript:
Option Explicit

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = 1


Dim objRecordSet_PhoneNumbers
Dim objRecordSet_Inbox
Dim objRecordSet_Outbox

Dim strConnectionString
Dim lngPrevCount


Set objRecordSet_PhoneNumbers = WScript.CreateObject("ADODB.Recordset")
Set objRecordSet_Inbox = WScript.CreateObject("ADODB.Recordset")
Set objRecordSet_Outbox = WScript.CreateObject("ADODB.Recordset")

strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='E:\Песочница\0199';Extended Properties=""text;"""

lngPrevCount = 0

Do
With objRecordSet_Inbox
On Error Resume Next

.Open _
"SELECT Time, PhoneNumber, Message FROM [in_file.txt]", _
strConnectionString, adOpenStatic, adLockOptimistic, adCmdText

If Err.Number = 0 Then
On Error Goto 0

If .RecordCount > lngPrevCount Then
WScript.Echo "Inbox total: " & CStr(.RecordCount) & ", new: " & CStr(.RecordCount - lngPrevCount)

objRecordSet_Outbox.Open _
"SELECT PhoneNumber, SomeFieldM, SomeFieldR, Message FROM [out_file.txt]", _
strConnectionString, adOpenStatic, adLockOptimistic, adCmdText

.MoveFirst
.Move lngPrevCount

Do Until .EOF
objRecordSet_PhoneNumbers.Open _
"SELECT PhoneNumber FROM [base.txt] WHERE PhoneNumber = '" & .Fields.Item("PhoneNumber").Value & "'", _
strConnectionString, adOpenStatic, adLockOptimistic, adCmdText

If objRecordSet_PhoneNumbers.RecordCount > 0 Then
objRecordSet_Outbox.AddNew _
Array("PhoneNumber", "SomeFieldM", "SomeFieldR", "Message"), _
Array(.Fields.Item("PhoneNumber").Value, "M", "R", .Fields.Item("Message").Value)

objRecordSet_Outbox.Update

.MoveNext
Else
WScript.Echo "Phone number [" & .Item("PhoneNumber").Value & "] not found in database"
End If

objRecordSet_PhoneNumbers.Close
Loop

objRecordSet_Outbox.Close

lngPrevCount = .RecordCount
End If

.Close
Else
Err.Clear
On Error Goto 0
End If
End With

WScript.Sleep 1000 * 60
Loop

WScript.Quit 0

Вместо «E:\Песочница\0199» укажите Ваш путь к папке с файлами. В той же папке создайте файл «Schema.ini» со следующим содержимым:
[base.txt]
ColNameHeader=False
Format=Delimited(;)
TextDelimiter=none
CharacterSet=ANSI
Col1=PhoneNumber Text

[in_file.txt]
ColNameHeader=False
Format=Delimited(;)
TextDelimiter=none
DateTimeFormat=mm.dd.yy hh:nn:ss
CharacterSet=ANSI
Col1=Time DateTime
Col2=PhoneNumber Text
Col3=Message Text

[out_file.txt]
ColNameHeader=False
Format=Delimited(;)
TextDelimiter=none
DateTimeFormat=mm.dd.yy hh:nn
CharacterSet=ANSI
Col1=PhoneNumber Text
Col2=SomeFieldM Text
Col3=SomeFieldR Text
Col4=Message Text


Ограничения:

1. В текстах сообщений нельзя использовать символ «;». В принципе, это ограничение лечится использованием кавычек для ограничения текстовых строк в файлах «base.txt», «in_file.txt», «out_file.txt»:
04:18:26;"79831501993";"Стою на ленина. Прошу помощи. Макар."
05:18:26;"79831501993";"Стою на Гагарина. Прошу помощи. Игнат."

Это возможно?

2. Файл «out_file.txt» может очищаться, но не должен удаляться. В принципе, можно сделать и обходной путь, ежели никак иначе нельзя.

3. Что такое «M» и «R» в «out_file.txt»?

VAFER
06-11-2012, 08:49
Iska, спасибо за предложение, но мне все же хотелось реализовать данный алгоритм на BAT/CMD.

Я не представляю, что мне делать с WSH на vbscript, куда его пихать, как запускать ?!
Да и опять надо по новой изучать язык.


Кавычки " увы применить нельзя. Программа работы с модемом не поймет.

M и R - это формат отправки сообщения

М - означает международный формат телефонного номера
R - текст на русском языке

VAFER
06-11-2012, 10:02
я создал файлы "prog.vbs" и "Schema.ini"
прописал путь к файлам

но как это запустить ???

при простом двойном клике ничего не происходит
при запуске в командной строке висит окно:

Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

и ничего не происходит


я никогда раньше с WSH на vbscript не работал...

VAFER
06-11-2012, 12:26
Добил всё таки вариант с BAT/CMD :)

@echo off
setlocal enabledelayedexpansion
set telok=0

rem считываем файл входящих смс, берем последнюю строку

FOR /F "tokens=2,3 delims=;" %%c in (in_file.txt) do (

set number=%%c
set textsms=%%d

)

echo %number% %textsms%


rem считываем базу телефонов из файла base.txt и сравниваем номер входящего смс с номерами в базе

set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b

IF %%a==%number% set telok=1
)

rem если номер совпал, то опять считываем базу телефонов из файла base.txt и формируем сообщение для каждого номера

IF %telok%==1 (

set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b
echo %%a;M;R;%textsms% %number% >> out_file.txt

)
)

rem пауза на 60 сек и опять запускаем сначала всю программу

ping -n 60 127.0.0.1 > nul

call prog2.cmd

осталось придумать как сделать чтобы программа знала что это новое сообщение во входящих
т.к. в этом виде она просто берет последнее сообщение из всех и формирует рассылку
и так каждые 60 сек :)

думал сделать внешний файл "count.txt" в котором хранить текущее количество входящих сообщений
и чтобы программа сравнивала число из файла с числом реальных сообщений в файле

мб есть более элегантные способы ? :)

VAFER
06-11-2012, 14:18
в итоге получилось вот так:

@echo off
setlocal enabledelayedexpansion
set telok=0

rem проверяем есть ли новые входящие сообщения в autoread

Set Lines=0
For /F "usebackq" %%L In (autoread.txt) Do (Set /A Lines+=1)
Echo входящих сообщений: %Lines%

for /F "tokens=*" %%n in (count.txt) do (
set count=%%n
)

if /i %lines% GTR %count% (

Echo %Lines% > count.txt
Echo есть новые сообщения

) else (

echo нет новых сообщений
goto END

)


rem считываем файл входящих смс берем последнюю строку

FOR /F "tokens=2,3 delims=;" %%c in (autoread.txt) do (

set number=%%c
set textsms=%%d

)

echo %number% %textsms%



rem проверяем есть ли телефон в базе

set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b

IF %%a==%number% set telok=1
)



rem если телефон есть формируем рассылку

IF %telok%==1 (

echo телефон есть в базе - формируем рассылку
set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b
echo %%a;M;R;%textsms% телефон для связи %number%
echo %%a;M;R;%textsms% телефон для связи %number% >> C:\simplesms\auto\out_file.txt
)

) else echo такого телефона нет в базе



:END

ping -n 60 127.0.0.1 > nul

call prog2.cmd



приму предложения по оптимизации :)

Iska
06-11-2012, 17:46
Iska, спасибо за предложение, но мне все же хотелось реализовать данный алгоритм на BAT/CMD. »
Увольте.

Я не представляю, что мне делать с WSH на vbscript, куда его пихать, как запускать ?! »
Я написал, как.

Кавычки " увы применить нельзя. Программа работы с модемом не поймет. »
Тогда без точки с запятой.

M и R - это формат отправки сообщения
М - означает международный формат телефонного номера
R - текст на русском языке »
Спасибо, ясно.

я создал файлы "prog.vbs" и "Schema.ini"
прописал путь к файлам
но как это запустить ???
при простом двойном клике ничего не происходит
при запуске в командной строке висит окно:
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.
и ничего не происходит »
А что должно происходить-то, я не пойму? Скрипт работает. Ждёт одну минуту, затем проверяет наличие новых сообщений в «in_file.txt». Если они есть — добавляет их в «out_file.txt», сверив каждый номер по списку из «base.txt». Затем снова ждёт. И так — по кругу.

VAFER
06-11-2012, 18:17
Iska, большое спасибо за участие, но я уже сделал то что мне было нужно на BAT/CMD :)

Iska
06-11-2012, 18:39
VAFER, ну, что ж тут поделаешь ;).




© OSzone.net 2001-2012