본문으로 바로가기

프로그램/PHP 검색 결과

해당 글 30

[PHP] 라인 Notify 기능

category 프로그램/PHP 2018/11/10 15:14
API 토큰 생성 사이트 :

https://notify-bot.line.me/my/

위 사이트에서 토큰을 발행 합니다.

아래의 기능으로 PHP 파일을 작성해서 데몬에 올려도 되고, cron에 작업해도 됩니다.


        $APIURL = "https://notify-api.line.me/api/notify";
        $APIKey = "발행한 Key";

        if ($imgUrl === null) {
            $postData = [
                "message" => $msg
            ];
        } else {
            $postData = [
                "message" => $msg,
                "imageThumbnail" => $imgUrl,
                "imageFullsize" => $imgUrl
            ];
        }
        
        $fields = '';
        foreach ($postData as $dataKey => $dataValue) {
            $fields .= $dataKey . '=' . $dataValue . '&';
        }
        rtrim($fields, '&');


        $curlOptions = [
            CURLOPT_URL => $this->APIURL,
            CURLOPT_POST => 1,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_POSTFIELDS => $fields,
            CURLOPT_HTTPHEADER => [
                "authorization: Bearer ". $APIKey,
                "content-type: application/x-www-form-urlencoded"
            ],
        ];

        $curl = curl_init();
        curl_setopt_array($curl, $curlOptions);

        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] date, 날짜 포맷 설정

category 프로그램/PHP 2018/10/29 09:38
년도와 관련된 포멧

 문자  설명 
Y 4자리 숫자로 표시  1999, 2003
y 2자리 숫자로 표시 99, 03
o ISO-8601에 맞는 포맷으로 표시
(Y랑 같으나, ISO 규격에 맞는 W가 포함한 년을 사용)
1999, 2003
L 윤년 여부 윤년 : 1
아닐경우 : 0


월과 관련된 포맷

문자  설명
 F 달을 영어로 표시  January, December
M 3자리의 짧은 영어로 표시 Jan, Dec
m 0을 앞에 붙인 2자리 숫자  01, 12
n 월을 숫자로 표시 1, 12
t 해당하는 달의 수를 표시 28, 30, 31


일과 관련된 포맷

문자 설명
d 0을 앞에 붙인 2자리 숫자 01 ~ 31
j 일을 숫자로 표시 1 ~ 31 
z 1년의 n번째 날  0 ~ 365
S 날짜 뒤에 영어 2글자 suffix 추가 st, nd, rd or th (j와 잘 연동됨)
예: 1st, 2nd, 3rd, 4th


요일과 관련된 표현

문자 설명
D 요일을 영어 3글자로 표시 Mon, Sun
l
(소문자 L )
요일을 영어 단어로 표시 Monday, Sunday 
N ISO-8601에 맞는 표시
(PHP 5.1 이후)
1 (월요일) ~ 7 (일요일) 
W 요일을 숫자로 표시 0 (일요일) ~ 6 (토요일)


주와 관련된 표현

문자 설명
W ISO-8601 에 맞는 1년의 n번째 주, 월요일에 한 주가 시작
(PHP 4.1 이후)
42 (1년의 42번째 주)


시간과 관련된 표현

문자 설명
H 시간을 24시간 기준 0을 채운 2자리 숫자로 표시  00 ~ 23
G  시간을 24시간 기준 숫자로 표시 0 ~ 23
h 시간을 12시간 기준 0을 채운 2자리 숫자로 표시  01 ~ 12
g 시간을 12시간 기준 숫자로 표시  1 ~ 12
a 소문자 오전, 오후  am, pm
A 대문자 오전, 오후 AM, PM
i 분을 0을 앞에 붙인 2자리 숫자로 표시  00 ~ 59 
s 초를 0을 앞에 붙인 2자리 숫자로 표시 00 ~ 59
u 밀리초를 표시
(date()를 항상 000000을 리턴, DateTime::format()은 밀리초를 지원, PHP 5.2.2 이상)
밀리초를 표시 (date()를 항상 000000을 리턴, DateTime::format()은 밀리초를 지원, PHP 5.2.2 이상)

출처: http://unikys.tistory.com/272 [All-round programmer]
654321
B Swatch Internet Time
(하루를 1000으로 나눔)
000 ~ 999 


타임존'과 관련된 문자

문자 설명
e 타임존 ID (PHP 5.1.0 이상) UTC, GMC, Atlantic/Azores 
I
(대문자 i)
섬머타임 여부 섬머타임이면 1 아니면 0 
O Greenwich time(GMT)와 다른 시간 +0200
P GMT와 다른 시간에 :를 추가
(PHP 5.1.3 이상)
+02:00 
T 타임존 약자 EST, MDT 
Z GMT와의 차이를 초로 표시
UTC 서쪽은 음수
동쪽은 양수
-43200 ~ 50400


전체 양식

문자 설명
c ISO-8601 기준의 날짜 표시
(PHP 5 이상)
2004-02-12T15:19:21+00:00
r RFC 2822 기준 포맷 Thu, 21 Dec 2000 16:01:07 +0200
U Unix Epoch (January 1 1970 00:00:00 GMT) 로부터의 초 time() 참고
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] MySQL 데이터 출력

category 프로그램/PHP 2018/02/21 12:08
1. mysql_fetch_row()
mysql_fetch_row()는 데이터를 0으로 시작하는 숫자형 인덱스 배열로 반환합니다.
ex) $row = mysql_fetch_row($result);
echo $row[0];


2. mysql_fetch_assoc()
mysql_fetch_assoc()는 데이터를 문자형 연관 배열로 반환합니다.
배열의 키 이름으로는 필드의 이름을 갖습니다.
ex)
$row = mysql_fetch_assoc($result);
echo $row['key'];


3. mysql_fetch_array()
mysql_fetch_array()는 $result_type의 값에 따라 반환될 배열의 형태가 다릅니다.

$result_type의 값으로는 아래와 같은 상수가 올 수 있으며, 기본값은 MYSQL_BOTH입니다.
  - MYSQL_NUM: 이 상수를 사용하면 숫자형 인덱스 배열을 반환합니다.  =  mysql_fetch_row()
  - MYSQL_ASSOC: 이 상수를 사용하면 문자형 연관 배열을 반환합니다.  =  mysql_fetch_assoc()
  - MYSQL_BOTH: 이 상수를 사용하면 인덱스 배열과 연관 배열을 동시에 반환합니다.

ex)  $row = mysql_fetch_array($result, MYSQL_BOTH)
echo $row['key'];
   

4. mysql_result()
mysql_result($query,0,0);    =>  ' 0행 0열 값 '
mysql_result($query,0,1)     =>  ' 0행 1열 값 '
mysql_result($query,1,1)     =>  ' 1행 1열 값 '


5. 주의 사항
mysql_fetch_row(), mysql_fetch_assoc(), mysql_fetch_array() 세 함수는 한 행에서 데이터를 읽습니다.
또한 데이터를 읽은 후 함수 내부의 포인터를 증가시켜 다시 호출될 때 다음 행을 읽을 수 있도록 합니다.

이후데 다시 동일한 결과를 호출 하면은 0번이 아닌 1번부터 나오며 이를 초기화하는 방법은 다음과 같습니다.

//mysql
mysql_data_seek($result, 0);

//mysqli
$result= $con->query($query);
$result->data_seek(0);
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] twitter API를 통해서 데이터 얻기

API 파일 출처 : http://github.com/j7mbo/twitter-api-php

위 사이트에서 API 파일을 획득 하였으며, 해당 기능을 위해서 사용을 합니다.
트위터에 글을 올릴수도 있지만 현재 제가 사용하는 기능은 특정 계정의 글을 수집해서 서버에 저장 하기 위해서 필요한 기능입니다.
API 파일에는 그 밖에도 많은 기능이 있지만은 전 일방적으로 글 내용을 가져오는 기능으로만 코드를 정리 합니다.

/**
 * API 사용을 위한 기본 설정
 **/
$SETTINGS = array(
        'consumer_key' => "트위터에서 제공해주는 값",
        'consumer_secret' => "트위터에서 제공해주는 값",
        'oauth_access_token' => "트위터에서 제공해주는 값",
        'oauth_access_token_secret' => "트위터에서 제공해주는 값"
    );
$URL = 'https://api.twitter.com/1.1/statuses/user_timeline.json';

/**
 * 트위터에 요청하고 결과값 받기
 **/
$getfield = '?screen_name=트위터 계정명&count=받아올 숫자';
$twitterObj = new TwitterAPIExchange($SETTINGS);
$response = $twitterObj->setGetfield($getfield)->buildOauth($URL, 'GET')->performRequest();
$response =  json_decode($response, true);


이 이후 설정을 자신의 결과값을 보고 필요한 형태로 가공을 하면 됩니다.
현재 가공 정보가 제가 독자적으로 가공하는 정보여서 기본 형태를 새롭게 만들경우에 해당 글을 업데이트 하도록 하겠습니다.





크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] 문자열 안에 포함된 특정 문자의 숫자

<?php
$str = "a@bcdedf@";
echo substr_count($str, "@");
// 결과값 : 2
?>
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] PHP MySQL PDO Class 파일 Ver. 2

category 프로그램/PHP 2016/09/24 10:11
[PHP] PHP MySQL PDO Class 파일 Ver. 2

기존에 동일한 게시물이 있습니다.
물론 크게 변하지는 않았지만 요구하는 조건이 서로 다르기에 글을 하나더 늘리는 방향으로 잡았습니다.
다소 중복된 글이 있더라도 양해해주시기 바랍니다.
이전 게시물을 보기 위해서는 이곳(PHP MySQL PDO Class 파일)을 클릭해주십시오.

이렇게 변경한 이유는 게시판에 사용을 하기 위해서 하다보니 매일 limit 를 사용하고 전체 게시물을 구하는 작업을 좀 줄여 보기 위해서 입니다.
실제적으로는 MySQL에 쿼리를 2번 조회하지만 실행 파일에서는 1번만 하면은 모든것이 됩니다.
limit , offset을 조합해서 사용할 수 있도록 수정을 한 버전입니다.

<?php
class DbMysqlLocal {

    private $host = 'localhost';
    private $user = 'user ';
    private $pass = 'pass ';
    private $dbname = 'dbname ';
    private $port = '3306';

    
    private $dbh;
    private $error;
    
    private $stmt;
    private $stmt1;
    
    private $foundrow;
    
    public function __construct()
    {

        // Set DSN
        $dsn = 'mysql:host='.$this->host.';port='.$this->port.';dbname='.$this->dbname;
        // Set options
        // ATTR_EMULATE_PREPARES : limit offset 에 숫자 넣으면은 에러 날 경우에 이 옵션 활성화
        $options = array(
            PDO::ATTR_PERSISTENT        => true,
            PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES  => false
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            $this->dbh->exec("SET CHARACTER SET utf8");
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }
    
    /**
     * @brief
     *
     **/
    public function query($query)
    {
        //echo 'InQuery : '.$query.chr(10);
        $this->stmt = $this->dbh->prepare($query);
    }
    
    public function bind($param, $value, $type = null)
    {
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        
        $this->stmt->bindValue($param, $value, $type);
    }
    
    /**
     * @brief
     *
     **/
    public function execute()
    {
        return $this->stmt->execute();
    }
    
    /**
     * @brief
     *
     **/
    public function resultset()
    {
        $this->execute();
        $return = $this->stmt->fetchAll(PDO::FETCH_ASSOC);
        
        $this->stmt1 = $this->dbh->prepare("SELECT FOUND_ROWS()");
        $this->stmt1->execute();
        $row = $this->stmt1->fetch();
        $this->foundrow = $row[0];
        
        return $return;
    }
    
    /**
     * @brief
     *
     **/
    public function single()
    {
        $this->execute();
        $return = $this->stmt->fetch(PDO::FETCH_ASSOC);

        $this->stmt1 = $this->dbh->prepare("SELECT FOUND_ROWS()");
        $this->stmt1->execute();
        $row = $this->stmt1->fetch();
        $this->foundrow = $row[0];
        
        return $return;
    }
    
    /**
     * @brief
     *
     **/
    public function rowCount()
    {
        return $this->stmt->rowCount();
    }
    /**
     * limit 사용하더라도 전체 row 수를 가져올 수 있는 select 에서 사용함
     **/
    public function rowFound()
    {
        return $this->foundrow;
    }    
    
    /**
     * @brief
     *
     **/
    public function lastInsertId()
    {
        return $this->dbh->lastInsertId();
    }
    
    /**
     * @brief
     *
     **/
    public function debugDumpParams()
    {
        return $this->stmt->debugDumpParams();
    }
    
    /**
     * @brief
     *
     **/
    public function showMessage()
    {
        return $this->error;
    }
    
    /**
     * @brief
     *
     **/
    public function beginTransaction()
    {
        return $this->dbh->beginTransaction();
    }
    
    /**
     * @brief
     *
     **/
    public function endTransaction()
    {
        return $this->dbh->commit();
    }
    
    /**
     * @brief
     *
     **/
    public function cancelTransaction()
    {
        return $this->dbh->rollBack();
    }
    
    
}




크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] class 자동 로딩(autoload)

category 프로그램/PHP 2016/09/21 13:59
[PHP] class 자동 로딩(autoload)

지속적으로 class 파일이 늘어 남으로 인해서 include, require 를 사용하기도 힘들어지기도 합니다.
그래서 최상단에 모든 파일이 1개 파일을 호출 하면은 class 파일은 자동으로 로딩하도록 하기 위해서 PHP에서 제공하는것을 사용해서 사용을 하고 있습니다.

/* 편의상 comm.php 라고 해당 파일을 명명하겠습니다. */
define('_CLASSPATH_',  '/home/user/class');

spl_autoload_register(function ($class) {
    require_once (_CLASSPATH_.'/class/'.$class.'.class.php');
});


위에 파일을 하나 만들고 사용하고 싶은곳은 파일에서 위의 파일을 include, require 하면 됩니다.

이렇게 하면은 class 파일간에 상속이 필요하지 않습니다.
제가 만들다가 알게 된것이라서 100% 공식적인 기능이라고 생각 하지 않지만 저는 잘 사용하는 편입니다.

class 파일은 welcome.class.php , getout.class.php 파일입니다.
실제 실행되는파일은 main.php 파일입니다.


main.php 파일은 welcome.class.php 을 선언하고 사용을 하지만은 올바르지 않으면은 쫒아 내려고 합니다.
welcome.class.php 파일은 일단 환영을 하도록 되어 있지만 쫒아내는 기능은 없습니다.

저는 예전에는 main.php 파일에서 welcome.class.php 도 포함하고 getout.class.php 도 포함해서 사용을 했지만은 지금은 이렇게 사용을 하고 있습니다.
main.php 에서 welcome.class.php 포함해서 사용을 하다가 welcome.class.php 파일에서 getout.class.php 파일을 선언해서 사용을 합니다.
그러면은 main.php 파일은 깔끔하게 welcome.class.php 만 호출하기에 가편하기도 한것 같고요...

아래에 한번 예제적으로 소스 코드 적어 보겠습니다.

아래 main.php에서는 1개의 클래스 파일만 조회하면은 됩니다.
주 목적이 해당 사용자에게 인사를 하는것이지 체크를 하기 위해서는 아닙니다.
그렇기에 main.php에서는 인사를 보여주도록 합니다.
/* main.php */
$welcomeObj = new Welcome();
echo $welcomeObj->accessCheck();


이제 인사쪽에서 와서는 이 사람이 정식적으로 허가가 된 사람인지도 알아야 합니다.
하지만 자기 본래 기능은 인사이지 다른 기능이 아닙니다.
그래서 쫒아낼지에 대해서는 알 수 없어서 해당 class 파일에게 요청을 합니다.
/* Welcome.class.php */
class Welcome {
    function accessCheck()
    {
       $getoutObj = new Getout();
       $data = $getoutObj->check();

       if( isset($data) ) {
           return '잘 들어왔어요';
       } else {
           return null
       }
    } 
}


쫒아낼지 결정하는 class 파일에서는 일단 들어온 요청으로 값을 체크해서 정확한지 판단을 합니다.
이 사람이 정상적이면은 통과하고 아니면은 쫒아내라고 할수 있고 그 자리에서 멈춰서 더 이상 실행이 되지 않도록 할수도 있습니다.
/* Getout.class.php */
class Getout {
    function check() 
    {
       if( 접속자  == 허용) {
          return true;
       } else {
           return false;
       }
    }
}



아직 배우는 입장이여서 정확하게 설명을 부족하지만은 class 파일이 이렇게 긴밀하게 연결되는것은 좋지 않다고 생각도 하지만은 class 파일은 자신의 할일은 명확해야 합니다.
만약 사용자 접근을 동일 class 안에서 모두 처리하면 class 내에 파일이 지저분하게 늘어나기도 하고, 어떤곳은 수정이 되지만 어떤곳은 되지 않는 경우도 발생을 합니다.

그래서 class 파일은 명확한 일을 하고 그 해당 일이 아닌것은 다른곳에서 도움을 받고 그 결과값을 받아야 한다고 생각을 합니다.
서로 서로 연결되다 보면은 전달하는 인자값이나 결과값을 모두 생각해야 되기 때문에 정확하게 작성하고 파일에 대한 설명도 정확하게 있어야 할것 같습니다.

더욱더 열심히 공부를 해서 좀 더 정확하게 한번 해보도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] 문자 타잎 체크

category 프로그램/PHP 2016/07/27 08:53
function StrTypeCheck($str, $type){

    switch ($type){
        case "digit":    //숫자만
            $filter = "'^[[:digit:]]*$'";
        break;
        case "alpha":    //영문만
            $filter = "'^[[:alpha:]]*$'";
        break;
        case "alnum":    //영문,숫자만
            $filter = "'^[[:alnum:]]*$'";
        break;
        case "falnum":    //영문,숫자만(첫자는 영문)
            $filter = "'^[a-zA-Z][0-9a-zA-Z]*$'";
        break;
        case "lalpha":    //소-영문만
            $filter = "'^[a-z]*$'";
        break;
        case "ualpha":    //대-영문만
            $filter = "'^[A-Z]*$'";
        break;
        case "lalnum":    //소-영문,숫자만
            $filter = "'^[0-9a-z]*$'";
        break;
        case "ualnum":    //대-영문,숫자만
            $filter = "'^[0-9a-z]*$'";
        break;
        case "email":    //이메일
            $filter = "'^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$'";
        break;
        case "domain":    //도메인
            $filter = "'^[a-zA-Z0-9]*((-|\.)?[a-zA-Z0-9])*\.([a-zA-Z]{2,4})$'";
        break;
        case "koralnum":    //한글숫자영문
            $filter = '/^([\xEA-\xED][\x80-\xBF]{2}|[0-9a-zA-Z])+$/';
        break;
        case "koralnumspace":    //한글숫자영문공백
            $filter = '/^([\xEA-\xED][\x80-\xBF]{2}|[0-9a-zA-Z\s])+$/';
        break;
        case "kor":        //한글
            $filter = '/^([\xEA-\xED][\x80-\xBF]{2})+$/';
        break;
    }

    if( preg_match($filter, $str, $matches) )    return true;
    else                                            return false;

}
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] PHP MySQL PDO Class 파일

category 프로그램/PHP 2016/04/05 08:56
평소 작업을 하기 위해서 SQL 인젝션도 생각해야 되고 조금 귀찮은 부분이 있었는데....
이제는 그냥 PDO를 사용해 버립니다.

그럼으로 인해서 인젝션는 그냥 조금 무시하는 편입니다.


<?php
class dbMysql {

    private $host = "localhost";
    private $user = "사용자";
    private $pass = "암호";
    private $dbname = "데이터베이스";
    
    private $dbh;
    private $error;
    
    private $stmt;
    
    public function __construct() {
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT    => true,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            $this->dbh->exec("SET CHARACTER SET utf8");
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }
    
    /**
     * @brief
     *
     **/
    public function query($query){
        $this->stmt = $this->dbh->prepare($query);
        //echo $query.chr(10);
    }
    
    public function bind($param, $value, $type = null){
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        
        $this->stmt->bindValue($param, $value, $type);
    }
    
    /**
     * @brief
     *
     **/
    public function execute(){
        return $this->stmt->execute();
    }
    
    /**
     * @brief
     *
     **/
    public function resultset(){
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    /**
     * @brief
     *
     **/
    public function single(){
        $this->execute();
        return $this->stmt->fetch(PDO::FETCH_ASSOC);
    }
    
    /**
     * @brief
     *
     **/
    public function rowCount(){
        return $this->stmt->rowCount();
    }
    
    /**
     * @brief
     *
     **/
    public function lastInsertId(){
        return $this->dbh->lastInsertId();
    }
    
    /**
     * @brief
     *
     **/
    public function debugDumpParams(){
        return $this->stmt->debugDumpParams();
    }
    
    /**
     * @brief
     *
     **/
    public function showMessage() {
        echo $this->error;
    }
    
    /**
     * @brief
     *
     **/
    public function beginTransaction(){
        return $this->dbh->beginTransaction();
    }
    
    /**
     * @brief
     *
     **/
    public function endTransaction(){
        return $this->dbh->commit();
    }
    
    /**
     * @brief
     *
     **/
    public function cancelTransaction(){
        return $this->dbh->rollBack();
    }
    
    
}
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

가공된 정보를 텔레그램으로 수진하는것입니다. 네이버 LINE이나 kakaotalk도 있지만 해당 메신저들은 공개된 API가 없어서 우회해서 받아야 하기 때문에 귀찮은 작업이 동반되지만 텔레그램은 봇을 통해서 제가 직접 메세지를 작성해서 보내면은 제가 수진을 할 수도 있습니다.

제가 활용하는것은 RSS수집후 필요한 정보 알림과, 서버의 정보를 일정시간마다 수신하는 방법으로 쓰고 있습니다.
이 방법외에도 봇을 통해서 계속 메세지를 받을 수 있습니다.

뭐 거창한것도 아니며, 제가 PHP로 사용하는 소스 코드입니다.
class를 흉내내서 만들어 둔것입니다.

※ PHP (cli)에서 작동합니다.

<?php

/*
https://telegram.me/botfather 접속하여 봇아빠를 채팅창에 호출 하고 다음 커맨드를 입력
 
-------------------------------
봇이름 /newbot
봇실제아이디(끝에 bot을 붙여준다)
/token
/setabouttext
봇정보 안내문구
/setdescription
접속문구
-------------------------------
 
token이 바로 api 
*/
class telegram {
    
// 기본환경설정
    private $tokenKey = '토큰키';
    private $baseUrl = 'https://api.telegram.org/bot';
    private $sendBool = false;
    private $messageChatId = '';
    private $messageText = '';
    
    /**
     * @brief
     *
     **/
    public function __construct() { 
        $this->baseUrl = $this->baseUrl.$this->tokenKey;
    } 
    /**
     * @brief   curl 요청 
     *
     **/
    private function GetCurl($url, $data=array()) {
        
        // 서버로 전송 및 결과 반환
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        
        return json_decode($result, true);
    }
     
     
    /**
     * @brief   텔레그램에서 정보를 가져오는것
     *
     **/
    public function getData($offsetId) {
        
        $url =  $this->baseUrl.'/getUpdates?limit=100&offset='.$offsetId; //?limit=1
        $return = $this->GetCurl($url);

        $returnData = array();
        foreach($return['result'] as $key=>$value) {

            //$Room_id[] = $value['message']['chat']['id'];
            $returnData[$key]['updateId']             = $value['update_id'];
            $returnData[$key]['messageText']          = $value['message']['text'];
            $returnData[$key]['messageDate']          = $value['message']['date'];
            $returnData[$key]['messageFromId']        = $value['message']['from']['id'];
            $returnData[$key]['messageFromUsername']  = $value['message']['from']['username'];
            $returnData[$key]['messageChatId']        = $value['message']['chat']['id'];
            $returnData[$key]['messageChatUsername']  = $value['message']['chat']['username'];
            
            // 단체방처리
            if( empty($returnData[$key]['messageChatUsername']) == true) {
                $returnData[$key]['messageChatUsername'] = $value['message']['chat']['title'];
            }
        }

        // 일단 받아온 정보 리턴
        return $returnData;
    }
    
    /**
     * @brief   텔레그램으로 전달하는것
     *
     **/
    public function setData($msg='', $chatId='') {
        
        $returnBool = false;
        
        if( empty($msg) == false && empty($chatId) == false) {
            //echo '전송 완료'.chr(10);
            
            // 메세제 URL 조합하기
            $urlSum = '';
            $urlSum .= $this->baseUrl.'/sendMessage?chat_id=';
            $urlSum .= $chatId;
            $urlSum .= '&text='.urlencode($msg);
            
            $sendStatus = $this->GetCurl($urlSum);
            $returnBool = $sendStatus['ok'];
            
        }
        
        return $returnBool;
    }
}


위에것이 전체적으로 사용되는 class 파일리며, 이제 Chat ID를 획득 해야 합니다.
전체 코드를 모두 공개 할 수는 없지만은 일단 일부 코드를 공개 합니다.

$tg = new telegram();
$returnData = $tg->getData($offsetId);

foreach($returnData as $key=>$value) {
        //echo "V 체크할ID         : ".$offsetId.Chr(10);
        //echo "V updateId      : ".$value['updateId'].Chr(10);
        //echo "V message Text: ".$value['messageText'].Chr(10);
        //echo "V message Date       : ".$value['messageDate'].Chr(10);
        //echo "V message From Id      : ".$value['messageFromId'].Chr(10);
        //echo "V message From Username     : ".$value['messageFromUsername'].Chr(10);
        //echo "V message Chat Id      : ".$value['messageChatId'].Chr(10);
        //echo "V message Chat Username      : ".$value['messageChatUsername'].Chr(10);
}



위코드를 가지고 이제 DB에 chatID를 저장하고 하면 됩니다.
그러면은 이제 봇을 통해서 대화방에 들어온 ID는 모두 DB에 저장되기 때문에 이 ID로 구분해서 전송을 할 수 있습니다.

호출하는것은 쉽게 아래와 같습니다.
일단 전송하는것인데...... 전송할 채팅방ID는 위에서 획득한 정보를 가지고 조합하시면 됩니다.

    $tg = new telegram();
    $returnBool = $tg->setData($value['sendText'], 채팅ID);



사용에 대해서 캡쳐를 해야 하지만은 공개해도 될 내용이 없어서 추후에 공개해도 무관한 내용이 올라오면은 캡쳐 해서 올려 보겠습니다.


크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

Trudy
Trudy 님의 블로그
MENU
VISITOR 오늘143 / 전체369407