読者です 読者をやめる 読者になる 読者になる

基本的に怠Diary

学習ログを残したい

ミント、Golangまたやるってよ。

ちなみに元ネタ全く知らないよ。



暇だったのでクッソ有名なRSSライブラリ使って遊んでたよ。


github.com



これです。


ここのテストに書いてあるように利用すれば簡単にRSSで取得できました。



取得して後ろに日付つけたテキストファイルに保存まではできました。


後フィルタ(笑)機能もついていて、TitleとDescriptionに指定した単語が含まれていないものは弾くというものです。




package main

import (
	"fmt"
	"io/ioutil"
        "os"
	"regexp"
	"time"
	"bufio"
	"strings"
	"strconv"
	rss "github.com/jteeuwen/go-pkg-rss"
)

func main(){
	checkRSS("http://b.hatena.ne.jp/hotentry/it.rss")
}

func checkRSS(uri string){
	feed := rss.New(20,false,chanHandler,itemHandler)
	err := feed.Fetch(uri,nil)
	if err != nil {
		fmt.Fprintf(os.Stderr, "[e] %s: %s", uri, err)
		return
	}
}


func chanHandler(feed *rss.Feed, newchannels []*rss.Channel) {
	fmt.Printf("%d new channel(s) in %s\n", len(newchannels), feed.Url)
}

func itemHandler(feed *rss.Feed, ch *rss.Channel, newitems []*rss.Item) {
	contents := ""
	for _, item := range newitems {
		//別々よりこっちの方が早そう
		fmt.Println("title:" + item.Title + "\n")
		if isWordIncludingList(item.Title + item.Description){
			contents += "title:" + item.Title + "\n"
			for _, link := range item.Links {
				contents += "url:" + link.Href + "\n"
			}
		}
	}
	saveContentsLogFile(contents)
}

//受け取った文字列を日付付きのファイル名で./logの下に保存するよ
func saveContentsLogFile(contents string){
	t := time.Now()
	date := t.Format("20060102")
	hour := strconv.Itoa(t.Hour())
	ioutil.WriteFile("log/hatena_" + date + hour + ".txt",
								[]byte(contents),os.ModePerm)
}


func isWordIncludingList(title string) bool{
	var fp *os.File
	var err error
	
	fp, err = os.Open("list.txt")
	if err != nil {
		panic(err)
	}
	defer fp.Close()
	
	scanner := bufio.NewScanner(fp)
	for scanner.Scan() {
		ptr := regexp.MustCompile(strings.ToLower(scanner.Text()))
		if(ptr.MatchString(strings.ToLower(title))){
			return true
		}
	}
	if err := scanner.Err(); err != nil {
		panic(err)
	}
	return false
}

ほとんどパクったようなコードにゴミが混ざってるだけです・・・


これ自体進展させるとしたら

Sqliteを活用する。

・フィルタ機能をもう少し捻る。

GUIでいろいろ操作できるように。



これぐらいでしょうか。やる気は微妙にない。




RSSはもういい


次の記事はJUnitでなんかいろいろする記事の予定です。